Aufteilung von Zeilen mit gleichem Anfang

Hallo Perl-Spezialisten,
Ich würde gerne Zeilen mit jeweils gleichem Anfang aus einer csv Datei in verschiedene Dateien aufteilen.
Kurzes Beispiel der Anwendung:

Kategorie Interpret Titel
Pop Peter Lied
Rock Uwe Song
Pop Ole Musik

Diese Datei soll derart gespalten werden, dass alle Zeilen, die mit Pop und jene mit Rock beginnen in eine einelne Datei geschrieben werden.
Da die reale Datei aber sehr viele unterschiedliche Kategorien enthält, wäre es nicht sinnvoll die Aufteilung anhand von fest programmierten Kategorie-Namen vorzunehmen, sondern wohl eher mit Hashes (oder etwas ähnlichem?) zu arbeiten.
Vielen Dank bereits für eure Antworten!

Hallo,

Kategorie Interpret Titel
Pop Peter Lied
Rock Uwe Song
Pop Ole Musik

Diese Datei soll derart gespalten werden, dass alle Zeilen,
die mit Pop und jene mit Rock beginnen in eine einelne Datei
geschrieben werden.
Da die reale Datei aber sehr viele unterschiedliche Kategorien
enthält, wäre es nicht sinnvoll die Aufteilung anhand von fest
programmierten Kategorie-Namen vorzunehmen, sondern wohl eher
mit Hashes (oder etwas ähnlichem?) zu arbeiten.

Du könntest z.B. alle Zeile in einem Hash speichern, sortiert nach dem Genre, und am Ende nach Anzahl der Liedern pro Genre sortieren, und die 5 häufigsten jeweils in eine Datei schreiben, und die resetlichen gemeinsam in eine andere Datei.

Hört sich das nach einem Plan an?
Wenn ja, fang an zu programmieren, und wenn du an einer Stelle nicht weiterkommst, kannst du noch mal nachfragen.

Grüße,
Moritz

Was hä

Hallo Moritz,
Vielen Dank für deine schnelle Antwort. Das Problem bei den Hashes ist, dass ich jedem key mehrere values zuordnen muss.
Unter http://www.unix.com/shell-programming-scripting/7355… habe ich in etwa das gefunden, was ich benötige, aber dort fehlt noch das Verteilen auf unterschiedliche Dateien.

Hallo Andy,

wie wäre es damit, die Datei zunächst zu sortieren (z.B. mit dem UNIX sort Kommando) und dann die Ausgabe an Perl zu übergeben. Das Prg. muesste dann nur noch bei jedem ‚Gruppenwechsel‘ eine neue Datei schreiben. In etwas so (ungetestet, quickndirty):

sed -n '2,$p' inputfile | sort | \
perl -e '
my $last\_category;
my $category;
while ()
{
 ($category) = split;
 if ($last\_category ne $category)
 {
 $last\_category = $category;
 open STDOUT "\> $category.txt" or die "open failed";
 }
 print STDOUT $\_;
}'

HTH
bernhard

Hallo,

Vielen Dank für deine schnelle Antwort. Das Problem bei den
Hashes ist, dass ich jedem key mehrere values zuordnen muss.

D.h. du als value eine array-referenz speichern.

Wie das geht ist z.B. hier beschrieben:

http://perldoc.perl.org/perlreftut.html

Grüße,
Moritz

Hallo Leute

Ich kann mir das ein bisschen einfacher vorstellen:
Man nimmt den Schlüssel und macht sich einen Dateinamen draus:

my $key = dasErsteWortKriegen();
my $datei = $key.".dat";

Das gibt dann z.B. „pop.dat“. Dann schreibe ich die Daten (die restliche Zeile) in die richtige Datei (angehängt).
Mehr braucht es scheinbar nicht.

lG
Martin B

3 Informatiker - 3 Lösungen: Danke für eure Hilfe!
Die Lösung von Martin scheint mir sehr elegant zu sein.