[gelöst] Perl: CSV-Datei nach bestimmter Spalte sortieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
zongo
Beiträge: 117
Registriert: 09.04.2007 23:53:46

[gelöst] Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von zongo » 18.02.2010 13:50:22

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

Benutzeravatar
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

Beitrag von SubOptimal » 18.02.2010 22:23:27

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.

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"
SubOptimal

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von Meillo » 18.02.2010 22:45:44

sort(1) kann das schon von selbst:

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"
Allerdings funktioniert das nur für eine vereinfachte Form von CSV: Strichpunkte dürfen nicht als Text innerhalb der Anführungszeichen auftauchen.
Use ed once in a while!

Benutzeravatar
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

Beitrag von SubOptimal » 18.02.2010 23:05:37

Hi,
Meillo hat geschrieben:sort(1) kann das schon von selbst:
Wenn man tagsüber mit Nicht-GNU Unix Tools arbeitet, dann vergisst (und vermisst) man so einiges an GNU Parametern. ;-)

SubOptimal

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von gms » 18.02.2010 23:26:10

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.
die Berücksichtigung dieses Einwandes macht das ganze doch etwas unübersichtlicher ( zumindest als "Einzeiler" ):

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"
Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von Meillo » 19.02.2010 09:37:15

SubOptimal hat geschrieben:
Meillo hat geschrieben:sort(1) kann das schon von selbst:
Wenn man tagsüber mit Nicht-GNU Unix Tools arbeitet, dann vergisst (und vermisst) man so einiges an GNU Parametern. ;-)
Nix GNU, das ist POSIX: http://www.opengroup.org/onlinepubs/009 ... /sort.html

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

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von nepos » 19.02.2010 13:24:22

Wenns wirklich sauber sein soll und in Perl würde ich zum Verarbeiten der CSV-Dateien das Modul Text::CSV empfehlen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von Meillo » 19.02.2010 13:49:11

nepos hat geschrieben:Wenns wirklich sauber sein soll und in Perl würde ich zum Verarbeiten der CSV-Dateien das Modul Text::CSV empfehlen.
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.
Use ed once in a while!

Benutzeravatar
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

Beitrag von SubOptimal » 20.02.2010 20:26:37

Hi Meillo,
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.
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. ;-)

SubOptimal

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von Meillo » 20.02.2010 21:37:22

SubOptimal hat geschrieben:
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.
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. ;-)
Leider habe immer noch nicht kapiert wie du das meinst.

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!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von gms » 20.02.2010 22:03:19

Meillo hat geschrieben: Geht es darum, dass meine Aufruf von oben auf deiner Solaris-Kiste nicht läuft?
der lauft unter Solaris ohne zu zicken

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"

Benutzeravatar
zongo
Beiträge: 117
Registriert: 09.04.2007 23:53:46

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von zongo » 16.03.2010 15:35:18

ich habe ganz vergessen mich zu bedanken!

DANKE!!!

Eure Antworten haben mir den Weg zur Lösung gezeigt ....

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Perl: CSV-Datei nach bestimmter Spalte sortieren

Beitrag von Meillo » 16.03.2010 18:24:53

zongo hat geschrieben:ich habe ganz vergessen mich zu bedanken!

DANKE!!!
Gern geschehen.
Eure Antworten haben mir den Weg zur Lösung gezeigt ....
Klasse.


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!

Antworten