Schön, so hatte ich mir das letztens gewünscht ;-)
Wenn Du den Teil
defau
true DPA01
false DPA02
false DPA03
false DPA01
nicht in Deiner Ausgabe haben willst, dann lass ihn doch bei der Ausgabe weg?
Warum gibst Du
$cols[0] aus, wenn Du es nicht haben willst?
Übrig bliebe ein
join{ : }, $cols[i]; wobei ein join() für ein Element keinen Sinn mehr ergibt.
Also lass das
join { : }, auch weg, bleibt also übrig:
say { $output_fh{$i} } $cols[$i];
Damit bekomme ich
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
# Kommandozeile; Ausgabedateien kontrollieren
$ for x in file?; do echo "--- $x ------"; cat $x; echo; done
--- file1 ------
ame_a
fault
fault
fault
--- file2 ------
ame_m
fault
fault
at
--- file4 ------
ame_f
fault
fault
2
--- file6 ------
en_affi
1
1
1
1
Das sieht mir doch gar nicht so schlecht aus, oder?
Wenn Du jeweils noch das Komma am Ende der Zeile haben willst, füge das Komma an das say() noch an:
say { $output_fh{$i} } $cols[$i], ",";
Wenn die Dateien nicht
fileX,
fileY, ... heißen sollen, sondern den Spaltennamen als Namen kriegen sollen, dann verwende ihn halt in Zeile 19:
Damit kommt:
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
# Kommandozeile; Ausgabedateien kontrollieren
$ for x in *_* ; do echo "--- $x ------"; cat $x; echo; done
--- ame_a ------
ame_a
fault,
,
fault,
fault,
--- ame_f ------
ame_f
fault,
,
fault,
2,
--- ame_m ------
ame_m
fault,
,
fault,
at,
--- en_affi ------
en_affi
1,
1,
1,
1,
PS: Das Format der DATA.csv sieht mir aus nach einer Mischung von CSV (komma-separierte Werte) und Datensätze mit fixer Länge. Kann da evtl. an der Datenquelle nachgebessert werden, um eine bessere Datengrundlage zu bekommen?
Dass die Kopfzeilen (Flags und Header) unterschiedliche Anzahl von Feldern haben, macht die Sache nur komplizierter.
Wenn das evtl. Daten fixer Länge sind, Dann könnte man dass auch mit unpack() einlesen.
Wenn die Daten doch "CSV" sind, aber die Leerzeichen am Beginn der Datenfelder keine Relevanz haben, könnte man sie über ein anderes split-Pattern gleich "entsorgen".
Mit
my @cols = split qr{ ,\s* }x, $line;
ergibt es dann:
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
# Kommandozeile; Ausgabedateien kontrollieren
$ for x in *_* ; do echo "--- $x ------"; cat $x; echo; done
--- ame_a ------
ame_a
fault,
,
fault,
fault,
--- ame_f ------
ame_f
fault,
,
fault,
2,
--- ame_m ------
ame_m
fault,
,
fault,
at,
--- en_affi ------
en_affi
1,
1,
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!