[gelöst] Perl: CSV-Datei nach bestimmter Spalte sortieren
[gelöst] Perl: CSV-Datei nach bestimmter Spalte sortieren
Hallo zusammen!
Mein Kenntnisse in Perl sind leider etwas eingerostet. Ich stehe vor dem Problem eine CSV-Datei einlesen zu müssen und diese dann zeilenweise nach einer bestimmten Spalte sortieren zu müssen.
Beispiel für CSV-Datei "file.csv" :
"SpalteA";"SpalteB";"SpalteC";"SpalteD"
"aaa";"123";"fggh";"4tfggt6"
"bbb";"6434";" dghdf";"5ggfd5"
"ccc";"4355362";"dfgdtz";"25gfdge5"
Wie stelle ich es an, das ich die Zeilen anhand des Inhalt von bspw. SpalteC auf/absteigend sortieren kann? Mache ich das über mehrdimensionale Arrays, muss ich mit Referenzen arbeiten oder sogar mit verschachtelten Hashes?
Da soetwas ja sicherlich häufiger mal vorkommt, gibt es doch sicherlich eine einfache Lösung, oder?
Danke schon im voraus!!!
Mein Kenntnisse in Perl sind leider etwas eingerostet. Ich stehe vor dem Problem eine CSV-Datei einlesen zu müssen und diese dann zeilenweise nach einer bestimmten Spalte sortieren zu müssen.
Beispiel für CSV-Datei "file.csv" :
"SpalteA";"SpalteB";"SpalteC";"SpalteD"
"aaa";"123";"fggh";"4tfggt6"
"bbb";"6434";" dghdf";"5ggfd5"
"ccc";"4355362";"dfgdtz";"25gfdge5"
Wie stelle ich es an, das ich die Zeilen anhand des Inhalt von bspw. SpalteC auf/absteigend sortieren kann? Mache ich das über mehrdimensionale Arrays, muss ich mit Referenzen arbeiten oder sogar mit verschachtelten Hashes?
Da soetwas ja sicherlich häufiger mal vorkommt, gibt es doch sicherlich eine einfache Lösung, oder?
Danke schon im voraus!!!
- SubOptimal
- Beiträge: 1709
- Registriert: 10.01.2005 23:25:46
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: bei Frankfurt
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Hi,
also wenn es nicht zwingend Perl sein muss und Deine Datei wirklich in dem Format des Beispiels vorliegt, dann könnte es z.B. so gelöst werden.
SubOptimal
also wenn es nicht zwingend Perl sein muss und Deine Datei wirklich in dem Format des Beispiels vorliegt, dann könnte es z.B. so gelöst werden.
Code: Alles auswählen
$ cat input.csv
"aaa";"123";"fggh";"4tfggt6"
"bbb";"6434";" dghdf";"5ggfd5"
"ccc";"4355362";"dfgdtz";"25gfdge5"
$ awk -F";" '{print $3,$0}' input.csv | sort | sed -n 's/^"[^"]*" \(.*\)/\1/p'
"ccc";"4355362";"dfgdtz";"25gfdge5"
"bbb";"6434";" dghdf";"5ggfd5"
"aaa";"123";"fggh";"4tfggt6"
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
sort(1) kann das schon von selbst:
Allerdings funktioniert das nur für eine vereinfachte Form von CSV: Strichpunkte dürfen nicht als Text innerhalb der Anführungszeichen auftauchen.
Code: Alles auswählen
$ <INPUT sort -t ';' -k 3
"ccc";"4355362";"dfgdtz";"25gfdge5"
"bbb";"6434";" dghdf";"5ggfd5"
"aaa";"123";"fggh";"4tfggt6"
"SpalteA";"SpalteB";"SpalteC";"SpalteD"
Use ed once in a while!
- SubOptimal
- Beiträge: 1709
- Registriert: 10.01.2005 23:25:46
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: bei Frankfurt
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Hi,
SubOptimal
Wenn man tagsüber mit Nicht-GNU Unix Tools arbeitet, dann vergisst (und vermisst) man so einiges an GNU Parametern.Meillo hat geschrieben:sort(1) kann das schon von selbst:
SubOptimal
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
die Berücksichtigung dieses Einwandes macht das ganze doch etwas unübersichtlicher ( zumindest als "Einzeiler" ):Meillo hat geschrieben: Allerdings funktioniert das nur für eine vereinfachte Form von CSV: Strichpunkte dürfen nicht als Text innerhalb der Anführungszeichen auftauchen.
Code: Alles auswählen
gms1 ~ # perl -n -e 'while (/^(\"[^\"]*\")(;(.*))?$/) { $al[$r][$c++]=$1; $_=$3 }; $r++; $c=0; END{ for( sort { $$a[2] cmp $$b[2] } @al ) { print "@$_\n"; } }' x.txt
"ccc" "435;362" "dfgdtz" "25gfdge5"
"bbb" "6434" "dghdf" "5ggfd5"
"aaa" "123" "fggh" "4tfggt6"
gms
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Nix GNU, das ist POSIX: http://www.opengroup.org/onlinepubs/009 ... /sort.htmlSubOptimal hat geschrieben:Wenn man tagsüber mit Nicht-GNU Unix Tools arbeitet, dann vergisst (und vermisst) man so einiges an GNU Parametern.Meillo hat geschrieben:sort(1) kann das schon von selbst:
... aber vielleicht hast du auch nur ungünstige Worte gewählt. ``GNU Parameter'' sind für mich die GNU-Erweiterungen die nicht im Standard sind. Wenn du das Wort ``GNU'' jeweils weglässt, dann sehe ich das ebenso:
Wenn man tagsüber mit Nicht-Unix Tools arbeitet, dann vergisst (und vermisst) man so einiges an Parametern.
Use ed once in a while!
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Wenns wirklich sauber sein soll und in Perl würde ich zum Verarbeiten der CSV-Dateien das Modul Text::CSV empfehlen.
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Dem stimme ich zu, dann innerhalb der Felder (in Doublequotes) dürfen Doublequotes AFAIR wieder auftauchen, wenn sie entsprechend ``gequoted'' sind. Ich weiß nicht was es da alles für Möglichkeiten gibt. Jedenfalls ist es wahrscheinlich, dass man selbst nicht alle Fälle berücksichtigt, und deshalb wäre ein ausgereiftes, fertiges Modul sicher die beste Wahl.nepos hat geschrieben:Wenns wirklich sauber sein soll und in Perl würde ich zum Verarbeiten der CSV-Dateien das Modul Text::CSV empfehlen.
Use ed once in a while!
- SubOptimal
- Beiträge: 1709
- Registriert: 10.01.2005 23:25:46
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: bei Frankfurt
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Hi Meillo,
SubOptimal
Genau so meinte ich das. Man gewöhnt sich halt schnell an so einige "bequeme" Sachen, z.B. -iname bei find. Wenn man dann tagsüber an einer Maschine mit Solaris arbeitet (auf der man nur ein normaler User ist und keine GNU Tools vorhanden sind), fehlt einem schon mal der ein oder andere Parameter.Meillo hat geschrieben:... aber vielleicht hast du auch nur ungünstige Worte gewählt. ``GNU Parameter'' sind für mich die GNU-Erweiterungen die nicht im Standard sind.
SubOptimal
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Leider habe immer noch nicht kapiert wie du das meinst.SubOptimal hat geschrieben:Genau so meinte ich das. Man gewöhnt sich halt schnell an so einige "bequeme" Sachen, z.B. -iname bei find. Wenn man dann tagsüber an einer Maschine mit Solaris arbeitet (auf der man nur ein normaler User ist und keine GNU Tools vorhanden sind), fehlt einem schon mal der ein oder andere Parameter.Meillo hat geschrieben:... aber vielleicht hast du auch nur ungünstige Worte gewählt. ``GNU Parameter'' sind für mich die GNU-Erweiterungen die nicht im Standard sind.
Geht es darum, dass meine Aufruf von oben auf deiner Solaris-Kiste nicht läuft?
Falls das der Fall ist, dann will ich entgegnen, dass die Optionen von der SUSv3 definiert sind.
Allerdings gibt es natürlich ältere Implementierungen die die neuen Standards nicht implementieren. Die alte Form von `-k 3' ist `+2' (Null-indiziert!). `-f \;' muss evtl. `-f\;' (ohne Leerzeichen) lauten, aber es kann auch sein, dass es nicht möglich ist, den Feldtrenner zu setzen.
... aber vielleicht meintest du auch etwas anderes.
Use ed once in a while!
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
der lauft unter Solaris ohne zu zickenMeillo hat geschrieben: Geht es darum, dass meine Aufruf von oben auf deiner Solaris-Kiste nicht läuft?
Code: Alles auswählen
gms@gmssun1:~$ sort -t ';' -k 3 <x.txt
"bbb";"6434";" dghdf";"5ggfd5"
"ccc";"4355362";"dfgdtz";"25gfdge5"
"aaa";"123";"fggh";"4tfggt6"
"SpalteA";"SpalteB";"SpalteC";"SpalteD"
gms@gmssun1:~$
gms@gmssun1:~$ uname -r
5.10
gms@gmssun1:~$
Gruß
gms
edit: oops, damit nicht jemand über die 'falsche' Reihenfolge meckert:
Code: Alles auswählen
gms@gmssun1:~$ LC_ALL=de.UTF-8 sort -t';' -k3 x.txt
"ccc";"4355362";"dfgdtz";"25gfdge5"
"bbb";"6434";" dghdf";"5ggfd5"
"aaa";"123";"fggh";"4tfggt6"
"SpalteA";"SpalteB";"SpalteC";"SpalteD"
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
ich habe ganz vergessen mich zu bedanken!
DANKE!!!
Eure Antworten haben mir den Weg zur Lösung gezeigt ....
DANKE!!!
Eure Antworten haben mir den Weg zur Lösung gezeigt ....
Re: Perl: CSV-Datei nach bestimmter Spalte sortieren
Gern geschehen.zongo hat geschrieben:ich habe ganz vergessen mich zu bedanken!
DANKE!!!
Klasse.Eure Antworten haben mir den Weg zur Lösung gezeigt ....
btw: Bitte denke daran, das nächste Mal den Thread dann auch als gelöst zu markieren. Dieses Mal habe ich's noch für umsonst für dich gemacht.
Use ed once in a while!