welche Möglichkeiten gibt es, große CSV-Dateien mit Hilfe von Perl zu
sortieren?
Normalerweise lese ich eine CSV-Datei in ein Hash ein, sortiere diesen und
gebe diesen dann in eine andere CSV-Datei aus.
Wenn nun die Datei entsprechend groß ist, könnte ich mir vorstellen, dass
die Sache mit dem Hash Probleme bereitet.
Freue mich auf Lösungsvorschlläge bzw. entsprechende Links, die sich mit
dieser Thematik befassen.
Tschüüüüsss und vielen Dank im voraus
JüBü
> Normalerweise lese ich eine CSV-Datei in ein Hash ein, sortiere diesen und
> gebe diesen dann in eine andere CSV-Datei aus.
> Wenn nun die Datei entsprechend groß ist, könnte ich mir vorstellen, dass
> die Sache mit dem Hash Probleme bereitet.
Spontan fällt mir dazu eine Variante des Guttman-Rosler-Transforms ein:
ein dreistufiger Prozess. (1) Datei satzweise einlesen, Schlüssel bilden
und dem Datensatz voranstellen (z.B. mit "\0"-Byte trennen oder anderem,
nicht in den Daten vorkommenden Zeichen); Satz in andere Datei
schreiben. (2) Zweite Datei mit externem Sortierprogramm sortieren[1].
(3) Sortierte Datei satzweise einlesen, Schlüssel am Satzanfange
zusammen mit Trennzeichen löschen, wieder herausschreiben. Ergebnis:
Sortierte Datei.
[1] Voraussetzung hierfür ist, dass das verwendete externe
Sortierprogramm mit großen Dateien umgehen kann, was aber nicht unüblich
ist -- das Problem, Dateien zu sortieren, die größer als der zur
Verfügung stehende Speicher ist, ist ja schon seit vielen, vielen Jahren
gelöst. (Three-Tape sort, sort/merge, usw. -- Details kenne ich nicht,
aber ich weiß, dass das ein gelöstes Problem ist.)
Gruß,
Philip
--
Philip Newton <nospam...@gmx.li>
That really is my address; no need to remove anything to reply.
If you're not part of the solution, you're part of the precipitate.
>Hallali,
>
>welche Möglichkeiten gibt es, große CSV-Dateien mit Hilfe von Perl zu
>sortieren?
Tips zum effizienten sortieren in perl unter
"A Fresh Look at Efficient Perl Sorting"
http://www.sysarch.com/perl/sort_paper.html
Gruß Jørgen
Einfachste Lösung:
DBD::CSV benutzen
http://search.cpan.org/author/JZUCKER/DBD-CSV-0.2002/lib/DBD/CSV.pm
Damit kannst Du über DBI wie auf jede andere SQL-Datenbank zugreifen,
führst also einen SELECT * FROM table SORT BY column durch und führst in
einer zweiten Tabelle entsprechend INSERTs aus. Hinterher benennst Du
die neue Tabelle nach der alten um und schon sollte alles hübsch
sortiert sein.
Tschüß
Marten
> > welche Möglichkeiten gibt es, große CSV-Dateien mit Hilfe von Perl zu
^^^^^
> > sortieren?
>
> Einfachste Lösung:
>
> DBD::CSV benutzen
Sortiert der bei "SORT BY" nicht im Speicher? Dann hätte Jürgen es auch
gleich selber machen können... Ich dachte, er suchte nach Möglichkeiten,
Dateien zu sortieren, die zu unhandlich sind, um sie komplett im
Speicher herumzuschaufeln.
Keine Ahnung, ich habe das Module nicht geschrieben sondern es nur mit
Erfolg benutzt. Ich glaube nicht, daß man mit CSV-Dateien riesige
Datenbanken baut, zumal ja pro Datei immer nur eine Tabelle gespeichert
werden kann. Insofern sollte das Arbeitsspeicherproblem während des
Sortierens keines sein.
Tschüß
Marten