Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CSV-Datei sortieren?

27 views
Skip to first unread message

Jürgen Büchner

unread,
Aug 31, 2002, 1:10:32 AM8/31/02
to
Hallali,

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ü


Philip Newton

unread,
Aug 31, 2002, 2:17:56 AM8/31/02
to
On Sat, 31 Aug 2002 07:10:32 +0200, "Jürgen Büchner" <in...@jbuechner.de>
wrote:

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

Jørgen von Bargen

unread,
Aug 31, 2002, 3:48:15 AM8/31/02
to
On Sat, 31 Aug 2002 07:10:32 +0200, "Jürgen Büchner"
<in...@jbuechner.de> wrote:

>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

Marten Lehmann

unread,
Aug 31, 2002, 7:43:02 AM8/31/02
to
> welche Möglichkeiten gibt es, große CSV-Dateien mit Hilfe von Perl zu
> sortieren?

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

Philip Newton

unread,
Aug 31, 2002, 2:28:07 PM8/31/02
to
On Sat, 31 Aug 2002 13:43:02 +0200, Marten Lehmann
<use...@variomedia.de> wrote:

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

Marten Lehmann

unread,
Sep 1, 2002, 10:55:02 AM9/1/02
to
> Sortiert der bei "SORT BY" nicht im Speicher? Dann hätte Jürgen es auch
> gleich selber machen können...

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

0 new messages