Thread 2 Dateien gleichzeitig bearbeiten (8 answers)
Opened by Henri at 2015-09-01 12:22

Linuxer
 2015-09-04 01:00
#182048 #182048
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
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:
more (24.1kb):
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DPA02:
ame_a fault
ame_m fault
ame_uc fault
ame_f fault
ams_l fault fault
enced_affi 1 1

DPA03:
ame_a fault fault
ame_m fault fault
ame_uc fault olt
ame_f fault fault
ams_l fault fault
enced_affi 1 1

DPA04:
ame_a fault fault
ame_m fault at
ame_uc fault fault
ame_f fault 2
ams_l fault fault
enced_affi 1 1
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!

View full thread 2 Dateien gleichzeitig bearbeiten