PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Textdatei Zeile für Zeile lesen und ändern



ManuelW
27-07-2007, 10:43
Hallihallo,

ich habe ein mittelschweres Problem.
Vornweg mal der Grund meine Postings und der Aufgabenstellung.
Ich bin Dj und kaufe mir regelmäßig mp3 welche ich dann als AudioCD mit CD-Text brenne. Nun möchte meine Audio-CD Sammlung verwalten und dazu den CD-Text auslesen.
Da ich die Cd's selber erstellt habe nutzen mir die herkömmlichen Programme nix,
da die alle nur mit CDDB arbeiten können, aber keines einfach den CD-Text auslesen kann.

Daher habe ich mich entschieden nun als Varwaltungssoftware OpenDB zu nutzen.
http://opendb.iamvegan.net
Dort muss ich aber die CD's per Textfile einfügen.
Nun bin ich so weit, das ich per cdda2wave mir den Inhalt der CD in ein Textfile ausgeben lasse.

cdda2wav -D /dev/cdrom -v titles -J &> cd-test.cvs

Das Ergebnis schaut dann folgendermaßen aus


Type: ROM, Vendor 'HL-DT-ST' Model 'DVDRAM GSA-4163B' Revision 'A105' MMC+CDDA
569344 bytes buffer memory requested, 4 buffers, 55 sectors
#Cdda2wav version 2.01.01a08+debburn, real time sched., soundcard, libparanoia support
CDINDEX discid: rEi3rIik.E7aSxUwM.XApAwLn4w-
CDDB discid: 0x9312b10c
CD-Text: detected
CD-Extra: not detected
Album title: 'Club [1]'
Track 1: 'Gimme Some More (Club Mix)' [from Aaron Mcclelland Feat. Magic Slym]
Track 2: 'Gimme Some More (Yer Man More Dirt Remix)' [from Aaron Mcclelland Feat. Magic Slym]
Track 3: 'I Found You (Remode)' [from Axwell]
Track 4: 'I Found U (Tocadisco Mix)' [from Axwell ]
Track 5: 'I Found You (Stutz Classic rework)' [from Axwell feat Charles Salter ]
Track 6: 'Shine (Ian Carey Remix)' [from Booty Luv]
Track 7: 'Shine (Moto Blanco Remix)' [from Booty Luv]
Track 8: 'Shine (Radio Edit)' [from Booty Luv]
Track 9: 'The Creeps (Fedde Le Grand Rem' [from Camille Jones]
Track 10: 'The Creeps (Funkerman Remix)' [from Camille Jones]
Track 11: 'The Creeps (Moonbootica Remix)' [from Camille Jones]
Track 12: 'The Creeps (Fonzerelli Remix)' [from Camille Jones Vs Fedde Le Grand]


Damit kann openDB natürlich nicht viel anfangen und ich muss das File nun per
Skript abändern, das es in etwa so ausschaut


1 - Aaron Mcclelland - Gimme Some More (Club Mix) - Club [1]
2 - Aaron Mcclelland Feat. Magic Slym - Gimme Some More (Yer Man More Dirt Remix) - Club [1]
3 - Axwell - I Found You (Remode) - Club [1]
4 - Axwell - I Found U (Tocadisco Mix) - Club [1]
...usw


Ich hoffe ihr versteht worauf ich hinaus möchte.
Mein Problem ist nun, ich weiss nicht wie ich das anfangen soll und womit.
Kann ich das mit einem Shellscript hin bekommen, oder besser Perl und vllt
könnt ihr mir ein paar Tips zu nötigen Befehlen geben mit denen ich mich dazu
auseinander setzen muss.

Oder evtl hat jemand auch eine ganz andere Lösung dafür.

Danke für Hinweise und Infos.
Manu

tschloss
27-07-2007, 12:24
Mit "grep" auf Zeilen filtern, die mit "Track" beginnen das Ergebnis sollte sich per "sed" zerlegen lassen.

Sed-Ausdruck etwa:
s/^Track *\([0-9]*\):/\1/
sollte schon mal die Tracknummern extrahieren.

man grep, man sed

Für eine genauere Umsetzung habe ich gerade keine Zeit...

/edit: Für die Kopfinfo muss man sich eine Spur mehr Mühe geben (Album-Title).
Aber mit der von dir vorgeschlagenen Perl-Umgebung ist auch das easy. Diese Filterung und Ersetzungsfunktion funktioniert analog auch in Perl.

ManuelW
27-07-2007, 16:16
Supi danke, das doch schon mal ein guter Denkanstoß.

Dann werd ich mir grad mal ein Perl Manual suchen und mich da ran setzen.

greez manu

inge
27-07-2007, 20:02
der denkanstoß bezog sich aber eher auf shell-script, vermute ich mal...

einfacher als mit shellscript bekommst du das glaub ich auch nicht hin...


cdda2wav -D /dev/cdrom -v titles -J|grep "^Track"|tr -s " "|sed -r "s/Track ([1-9]*): \'(.*) \((.*)\)\' (.*)/\1 - \3 - \2/g"
das dürfte schon reichen... (das ganze ist ungetestet!)

jan61
31-07-2007, 12:57
der denkanstoß bezog sich aber eher auf shell-script, vermute ich mal...

einfacher als mit shellscript bekommst du das glaub ich auch nicht hin...


cdda2wav -D /dev/cdrom -v titles -J|grep "^Track"|tr -s " "|sed -r "s/Track ([1-9]*): \'(.*) \((.*)\)\' (.*)/\1 - \3 - \2/g"das dürfte schon reichen... (das ganze ist ungetestet!)

Naja, erstmal fehlt noch die Ermittlung des Album-Namens, der in den Ausgabezeilen hinten erscheinen soll. Außerdem wird der Interpret nicht richtig ausgelesen (in der Ausgabe soll ja nicht "[from Axwell]" erscheinen) und die Tracknummer-Ermittlung geht bei den Tracks 1 - 9 schief, weil da 2 Leerzeichen nach "Track" stehen. Man müsste also noch ein wenig aufbohren. Ich würde Perl nehmen (auch um die offenbar nicht gewollten "Feat. ..."-Teile zu entfernen):

jan@jack:~/tmp> cat album.pl
#! /usr/bin/perl
use strict;
use warnings;
my $album = "";
while (<>) {
($album) = $_ =~ m/^Album title: '([^']+)'/ if /^Album title: '[^']+'/;
if (/^Track /) {
s/ [Ff]eat[^\]]+//;
my ($no, $title, $artist) = $_ =~ m/^Track\s+([0-9]+): '([^']+)'\s+\[from ([^\]]+)\]$/;
print $no, " - ", $artist, " - ", $title, " - ", $album, "\n";
}
}

exit 0;
Es ist natürlich klar, dass man hier in Abhängigkeit von den Eingangsdaten noch mehr machen muss, Titel können ja z. B. auch Bindestriche oder ' enthalten. Deshalb hier auch die umständlichere Variante, man hätte es kürzer auch so machen können:

...
if (/^Track /) {
s/ [Ff]eat[^\]]+//;
s/^Track\s+([0-9]+): '([^']+)'\s+\[from ([^\]]+)\]$/$1 - $3 - $2 - $album/;
print;
}
...
Jan

inge
31-07-2007, 13:43
Naja, erstmal fehlt noch die Ermittlung des Album-Namens, der in den Ausgabezeilen hinten erscheinen soll. Außerdem wird der Interpret nicht richtig ausgelesen (in der Ausgabe soll ja nicht "[from Axwell]" erscheinen) und die Tracknummer-Ermittlung geht bei den Tracks 1 - 9 schief, weil da 2 Leerzeichen nach "Track" stehen. Man müsste also noch ein wenig aufbohren. Ich würde Perl nehmen (auch um die offenbar nicht gewollten "Feat. ..."-Teile zu entfernen):

das mit den leerzeichen ist quark! (tr -s " ")

hier dann nochmal etwas überarbeitet:


album=cdda2wav -D /dev/cdrom -v titles -J|tee /tmp/cdinfo|grep "Album title:"|cut -d "'" -f2;cat /tmp/cdinfo|grep "^Track"|tr -s " "|sed -r "s/^Track ([0-9]*): [\'](.*) \((.*)\)[\'] \[from (.*)\]/\1 - \4 - \2 \3 - $album/g"

jan61
31-07-2007, 17:56
das mit den leerzeichen ist quark! (tr -s " ")

hier dann nochmal etwas überarbeitet:


album=cdda2wav -D /dev/cdrom -v titles -J|tee /tmp/cdinfo|grep "Album title:"|cut -d "'" -f2;cat /tmp/cdinfo|grep "^Track"|tr -s " "|sed -r "s/^Track ([0-9]*): [\'](.*) \((.*)\)[\'] \[from (.*)\]/\1 - \4 - \2 \3 - $album/g"

Warum das Quark ist, verstehe ich zwar nicht (Du entfernst mit tr ja alle mehrfach auftretenden Leerzeichen - z. B. auch in Titeln, Alben, Interpreten), und in Deinem ursprünglichen sed klappte es nun mal nicht, aber wenn Du meinst ...

Dein Code funktioniert nicht - zumindest nicht mit der Ausgabe, die ManuelW gepostet hat, da ist u. a. ein Syntaxfehler drin: Es muss album=`...` oder album=$(...) heißen, damit die Variable $album später den gewünschten Wert hat.

Mit folgender Variante kommt wenigstens die "Nr - Interpret - Titel"-Liste halbwegs so raus wie geplant (ohne Einsatz von tr) - hier ohne cdda2wav, ich nehme die von ManuelW gepostete Ausgabe:

album=`cat album.csv |tee /tmp/cdinfo|grep "Album title:"|cut -d "'" -f2`;cat /tmp/cdinfo|grep "^Track"|sed -r "s/^Track +([0-9]+): '(.+)'[ \t]+\[from (.+)\]/\1 - \3 - \2 - $album/"Damit hast Du jetzt 5 Kommandoaufrufe und 2 Subshells statt 1 Kommandoaufruf in der Perl-Version. Und einfacher als die Perl-Version ist das IMHO nicht mehr.

Jan