Thread File sortieren (13 answers)
Opened by Henri at 2015-08-05 13:40

Linuxer
 2015-08-05 23:08
#181731 #181731
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Schön, so hatte ich mir das letztens gewünscht ;-)

Wenn Du den Teil

Code: (dl )
1
2
3
4
5
6
                       
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:

Code (perl): (dl )
1
2
# Zeile 32
say { $output_fh{$i} } $cols[$i];


Damit bekomme 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
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:

Code (perl): (dl )
1
2
# Zeile 32
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:

Code (perl): (dl )
1
2
# Zeile 19
my $fname = $header[$i];


Damit kommt:
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
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
Code (perl): (dl )
1
2
# Zeile 30
my @cols = split qr{ ,\s* }x, $line;


ergibt es dann:

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
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!

View full thread File sortieren