Thread 2 Dateien gleichzeitig bearbeiten
(8 answers)
Opened by Henri at 2015-09-01 12:22
Der von Dir gezeigte Code liefert nicht die gezeigte erste Ausgabe.
Um das von Dir gewünschte zu erreichen, musst Du das (gezeigte) Skript verändern. Zunächst musst Du die zweite Datendatei auswerten und die Informationen der Spalten speichern. Danach wertest Du die erste Datendatei aus und gibst die gewünschten Werte aus der ersten UND der zweiten Datei aus. Ausserdem kannst Du Dir wahrscheinlich die clean-Routine sparen, wenn Du die Fähigkeiten von Text::CSV nutzen würdest. Ein Ansatz, der versucht, die Spalten anhand ihrer Namen zu verwenden, wäre folgender: Code (perl): (dl
)
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 use strict; use warnings; use Text::CSV; use Data::Dumper; # define input files my $infile1 = "/tmp/data1.csv"; my $infile2 = "/tmp/data2.csv"; # prepare csv parser (no need for clean() any more) my $csv = Text::CSV->new( { sep_char => ',', allow_whitespace => 1, binary => 1 } ); # open input files open my $csv_1, '<', $infile1 or die "open($infile1,r) failed: $!"; open my $csv_2, '<', $infile2 or die "open($infile2,r) failed: $!"; ### prepare data of data2.csv <$csv_2>; # ignore timestamp line of $infile2 my @columns2 = @{ $csv->getline($csv_2) }; # get column names my @values = @{ $csv->getline($csv_2) }; # get values my %data2; for my $i ( 0 .. $#columns2 ) { # fill %data2 with content # fill value with empty string if value not defined $data2{$columns2[$i]} = defined $values[$i] ? $values[$i] : ''; } # check %data2 warn Data::Dumper->Dump( [ \%data2 ], [ '*data2' ] ) if $ENV{DEBUG}; ### process data of data1.csv my @colums1; while ( my $row = $csv->getline( $csv_1 ) ) { next if 0 == $#{$row}; # skip empty lines next if 6 == $#{$row}; # skip lines with too less columns my ( $significator, $filename ) = split m{\s+}, $row->[0]; # store column names if ( $significator eq 'default' ) { @colums1 = @$row; shift @colums1; warn Data::Dumper->Dump( [ \@colums1 ], [ '*columns1' ] ) if $ENV{DEBUG}; } elsif ( $significator eq 'false' ) { warn Data::Dumper->Dump( [ $row ], [ '*row' ] ) if $ENV{DEBUG}; open my $wh, '>', $filename or die "open($filename,w) failed: $!"; printf $wh "%s:\n", $filename; shift @$row; for my $i ( 0 .. $#{$row} ) { printf $wh "%-10s %-10s %-10s\n", $colums1[$i], $data2{$colums1[$i]}, $row->[$i]; } close $wh or die "close($filename,w) failed: $!"; } } __END__ content of data files (between --8<--): data1.csv: --8<-- 20150714 00:08:49 false, false, false, false, true, true, default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi, true DPA01, fault, fault, fault, fault, fault, 1, false DPA02, , , , , fault, 1, false DPA03, fault, fault, olt, fault, fault, 1, false DPA04, fault, at, fault, 2, fault, 1, --8<-- data2.csv: --8<-- 20150616 22:16:09 default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi, default, fault, fault, fault, fault, fault, 1, --8<-- Damit erhalte ich: Code: (dl
)
1 DPA02: meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |