Leser: 25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
%col2 = ();
%col3 = ();
%col4 = ();
$input = @ARGV[0];
open (INP , "$input");
foreach (<INP>)
{
chomp;
@words = split /\s+/, $_;
$id = $words[0];
$col2 = $words[1];
$col3 = $words[2];
$col4 = $words[3];
if ( !exists($col2{$id}) )
{
$col2{$id} = $col2;
$col3{$id} = $col3;
$col4{$id} = $col4;
}
else
{
$col2{$id} .= " ".$col2;
$col3{$id} .= " ".$col3;
$col4{$id} .= " ".$col4;
}
$c++;
$a= $c %= 1000000;
if ($a == 0) {print "read another 1000000 lines!\n";}
}
while( my ($k, $v) = each %col2 ) {
print "key: $k, value: $v.\n";
# print "key: $k\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#!/usr/bin/perl use strict; use warnings; my %elements = (); my $input = $ARGV[0]; my $cnt=0; open (my $fh, '<', $input) or die("ERROR open $input ($!)\n"); while(my $line=<$fh>) { chomp($line); my ($id,@words) = split /\s+/, $line; $elements{$id}=\@words; $cnt++; if ($cnt % 1000000 == 0) {print "read another 1000000 lines!\n";} } close($fh); while( my ($k, $v) = each %elements ) { print "key: $k, value: ".join(', ',@$v).".\n"; }
1 2 3 4 5 6 7 8
#$elements{$id} = \@words; push @{ $elements{$id}->[$_] }, $words[$_] for 0 .. $#words; #... #print "key: $k, value: ".join(', ',@$v).".\n"; print "key: $k\n"; for my $i ( 0 .. $#{$v} ) { print " col $i: ". join( ', ', @{ $v->[$i] } ) ."\n"; }
push @{ $elements{$id}->[$_] }, $words[$_] for 0 .. $#words;
push(@{$elements{$id}},\@words);
1 2 3 4
print "key: $k\n"; for my $i ( 0 .. $#{$v} ) { print " col $i: ". join( ', ', @{ $v->[$i] } ) ."\n"; }
1 2 3 4 5 6
print "key: $k\n"; my $i=0; for my $vv (@$v){ print " values $i: ". join( ', ', @$vv ) ."\n"; $i++; }
2010-11-26T07:06:57 topegAber es kommt halt auch darauf an, was nachher mit den Daten gemacht werden soll.
2010-11-26T07:06:57 topeg
for 0..* Z @v -> $i, @vv { ... }
push @{ $elements{$id}->[$_] }, $words[$_] for 0 .. $#words;
@{
$#{$v}
2010-11-27T21:09:38 gmafx
2010-11-27T21:09:38 gmafxUnd das Drucken verstehe ich auch nicht :
1 2 3 4 5 6 7 8 9
my @value=@{$v}; for my $pos_in_value (0..$#value) { print " col $pos_in_value: "; my $array_ref=$value[$pos_in_value] my @colomns=@{$array_ref}; print join( ', ', @colomns); print "\n"; }
2010-11-27T21:09:38 gmafxWas ist bitte
Code: (dl )$#{$v}
2010-11-27T21:09:38 gmafxWie "heißen" denn nun eigentlich die 3 Arrays, die für die 3 Spalten angelegt wurden (Arrayreferenzen, oder?)? Wie kann ich gezielt Elemente ansprechen? Ich nehme an, ich muss dereferenzieren!??
Damit ich das endlich mal verstehe: wie spreche ich denn zum Besipiel für "ID1" den jeweils ersten Wert in den entsprechenden 3 Arrays an,
my $value=$elements{$id}->[0]->[0]
1 2 3 4 5
for my $id (keys(%elements)) { my @values=@{$elements{$id}->[1]} print "$id -> Col1: @values\n"; }
2010-11-27T21:09:38 gmafxnoch lieber wäre es mir, die entsprechenden Werte einfach an "lesbare" Arraydefintionen zu Übergeben, etwa so.
$first_value=$elements{$id}->{col1}->[0]
push @{ $elements{$id}->{"col$_"} }, $words[$_] for 0 .. $#words;
1 2 3 4 5 6 7 8 9
my %colomns=%{$v}; for my $col_name (sort keys(%colomns)) { print " $col_name: "; my $array_ref=$colomns{$col_name}; my @entrys=@{$array_ref}; print join( ', ', @entrys); print "\n"; }
my @sorted_keys = sort {was_auch_immer} keys %elements;
1 2 3 4 5 6
# an topegs Code angelehnt: my @columns; #... while (my $line = <$fh>) { #... push @{ $columns[$_]->{$id} }, $words[$_] for 0 .. $#words;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#!/usr/bin/perl use strict; use warnings; my %elements = (); my $input = $ARGV[0]; my $cnt=0; open (my $fh, '<', $input) or die("ERROR open $input ($!)\n"); while(my $line=<$fh>) { chomp($line); my ($id,@words) = split /\s+/, $line; #füge dem hasheintrag "$elements{$id}", # welches ein Array ist (siehe Autovivikation), # einen weiteren Eintrag hinzu, # der das Array "@words" ist. push(@{$elements{$id}},\@words); $cnt++; if ($cnt % 1000000 == 0) {print "read another 1000000 lines!\n";} } close($fh); while( my ($k, $v) = each %elements ) { print "key: $k\n"; for my $i ( 0 .. $#{$v} ) { print " cols $i: ". join( ', ', @{ $v->[$i] } ) ."\n"; } }
1
2
3
4
5
6
7
8
9
10
11
12
id1 test1a test1b test1c
id1 test1d test1e test1f
id1 test1g test1h test1i
id2 test2a test2b test2c
id2 test2d test2e test2f
id2 test2g test2h test2i
id3 test3a test3b test3c
id3 test3d test3e test3f
id3 test3g test3h test3i
id4 test4a test4b test4c
id4 test4d test4e test4f
id4 test4g test4h test4i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
key: id1
cols 0: test1a, test1b, test1c
cols 1: test1d, test1e, test1f
cols 2: test1g, test1h, test1i
key: id4
cols 0: test4a, test4b, test4c
cols 1: test4d, test4e, test4f
cols 2: test4g, test4h, test4i
key: id2
cols 0: test2a, test2b, test2c
cols 1: test2d, test2e, test2f
cols 2: test2g, test2h, test2i
key: id3
cols 0: test3a, test3b, test3c
cols 1: test3d, test3e, test3f
cols 2: test3g, test3h, test3i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
%elements=( 'id1' => [ [ 'test1a', 'test1b', 'test1c' ], [ 'test1d', 'test1e', 'test1f' ], [ 'test1g', 'test1h', 'test1i' ], ], 'id2' => [ [ 'test2a', 'test2b', 'test2c' ], [ 'test2d', 'test2e', 'test2f' ], [ 'test2g', 'test2h', 'test2i' ], ], 'id3' => [ [ 'test3a', 'test3b', 'test3c' ], [ 'test3d', 'test3e', 'test3f' ], [ 'test3g', 'test3h', 'test3i' ], ], 'id4' => [ [ 'test4a', 'test4b', 'test4c' ], [ 'test4d', 'test4e', 'test4f' ], [ 'test4g', 'test4h', 'test4i' ], ], );
2010-11-25T21:39:35 gmafx....
Ich freue mich über Anregungen und Ideen!
gma