datasette
Goto Top

Dateipfade innerhalb einer Textdatei ähnlich wie ID3-Tags behandeln und neu arrangieren

Wörtern zwischen bzw. neben definierten "Separatoren" wie z.B. Backslash und/oder
Bindestrich Eindeutigkeit zuweisen und innerhalb der Zeile nach Bedarf umstellen lassen...

Guten Tag die Herschaften dieser netten vielversprechenden Gemeinde!

Ich habe immer noch das unbequeme Gefühl mich etwas ungeschickt anzustellen oder den Wald vor lauter Bäumen nicht zu sehen;
denn nachdem ich einem gewissen Teil der Festplatte eine neue Ordnerstruktur verpasst habe, bleibt eine diesbezüglich relevante
Textdatei mit Inhalt der entsprechend alten Ordnerstruktur/Dateipfade als hartnäckige Aufgabe für mich zurück. Über die einzig mir
geläufige Methodik das Ganze, ählich wie z.B. bei einem Tag-Editor, irgendwie mit definieren von Separatoren zu behandeln erhoffte
ich mir in diversen Texteditoren (via RegEx) eine passende Lösung; musste jedoch dieses Vorhaben als hoffnungslos aussichtslos
abtun. Da mir die Angelegenheit natürlich keine Ruhe lässt bin ich hin und wieder mal am stöbern und heute auf dieses interessante
Forum gestoßen. Ich bin eine lange Zeit mit der Suche verweilt, um womöglich auf einen ähnlichen Fall zu stoßen oder mir ggf. aus
div. Beiträgen etwas gescheites herzuleiten. Da sich mir dieses Verfahren - das Schreiben einer eigenen Batchdatei - nun offenbar
sehr schwierig gestaltet bleibt einzig und allein Hoffnung auf ebenso kompetent und hilfsbereite Antworten, wie beim Durchforsten
der Beiträge, zu stoßen. Daher nun der Versuch meine Problematik mal darzustellen...


Gegeben ist eine ganz normale .txt-Datei mit jeweils einem kompletten Dateipfad pro Zeile (und stets identischer Anordnung):

x:\Übergeordneter Ordner\Ordner -- Name\Dateiautor -- Schaffenswerk -- Nummer -- [Datum].ext
x:\Übergeordneter Ordner\Ordner -- Name\Dateiautor -- Schaffenswerk -- Nummer -- [Datum].ext
x:\Übergeordneter Ordner\Ordner -- Name\Dateiautor -- Schaffenswerk -- Nummer -- [Datum].ext

diese sollen innerhalb der .txt-Datei pro Zeile in nachfolgendes Format umgestellt werden:

x:\Übergeordneter Ordner\Ordner\Datum -- Schaffenswerk -- Nummer.ext
x:\Übergeordneter Ordner\Ordner\Datum -- Schaffenswerk -- Nummer.ext
x:\Übergeordneter Ordner\Ordner\Datum -- Schaffenswerk -- Nummer.ext

Hierbei dachte ich mir das Backslash \ und Bindestriche -- als Separator o.ä. dienen und die Bereiche zwischen diesen
als Eindeutigkeiten (wie z.B. "Wort1\Wort2 -- Wort3.ext"definiert werden könnten?

Ich bin da echt überfragt und wäre über einen entsprechenden Vorschlag zur Umsetzung (gerne auch ein alternatives Programm
oder die Syntax für RegEx) äußerst dankbar!!! Ich versuche bei Unklarheiten zeitnah zu reagieren, was jedoch aktuell in Abhängigkeit
von meinem Nachtdienst ist. Vielen Dank trotzdem vorab und danke fürs zuhören =)

Grüße,

datasette

Content-Key: 143543

Url: https://administrator.de/contentid/143543

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: Biber
Biber 26.05.2010 um 13:18:33 Uhr
Goto Top
Moin datasette,

willkommen im Forum.

Nur zur Sicherheit, obwohl deine Beschreibung wirklich schon hervorragend ist, noch zwei Nachfragen zum Ist-Zustand

  • außer den angegeben doppelten Bindestrichen in deiner Namenskonvention sind keine einfachen Bindestriche vorhanden (z.B. ein Dateiautor "Müller-Lüdenscheid")?
  • Schaffenswerk und Dateiautor können auch aus mehreren Worten bestehen (z.B. "Mein Ehrenwort" von "Helmut Kohl" )?

Grüße
Biber
Mitglied: 77559
77559 26.05.2010 um 13:57:42 Uhr
Goto Top
Hallo datasette,

keine reine Batchlösung (ginge aber auch).
Dein Trenner " -- " ist zwar eindeutig, für die Batchverarbeitung aber eher ungünstig. Deshalb benutze ich Sed mit einer RegExp und ersetze die mit "#" wobei ich hoffe das das Nummernzeichen nicht im Text vorkommt.

@Echo off
:: x:\Übergeordneter Ordner\Ordner -- Name \Dateiautor -- Schaffenswerk -- Nummer -- [Datum].ext
:: A  B                     C         D     E             F                G          H      I
:: x:\Übergeordneter Ordner\Ordner\Datum -- Schaffenswerk -- Nummer.ext
:: A  B                     C      H        F                G      I
Set InFile=D:\Test\2010-05\26\test.txt
For /f "Tokens=1-9 delims=#\" %%A in (  
  'sed -n "s| -- |#|gp" "%InFile%"'  
    ) Do Echo %%A\%%B\%%C\%%H -- %%F -- %%G%%I

Gruß
LotPings

Upps, wenn man eine Hilfsvariable benutzt, sollte man die auch einsetzen face-wink
Mitglied: datasette
datasette 26.05.2010 um 14:18:26 Uhr
Goto Top
Hallo Biber,

danke fürs willkommen heißen =)

Es sind in der Tat ggf. Einfachbindestriche und Zeichen wie z.B. Komma und/oder "&" in der Namensgebung aller "Objekte?" möglich. Also sowohl in "Übergeordneter Name" als auch in "Dateiautor".
Und ebenfalls ist es möglich, das die oben dargestellten Objekte wie "Schaffenswerk" und/oder "Dateiautor" aus mehreren Worten bestehen können.

Vollkommen korrekt!

An dieser Stelle vielleicht vorsichtshalber nochmal die exakte alte Pfadstruktur:

x:\Übergeordneter Ordner\Ordner -- Name [Jahrtausend]\Dateiautor -- Schaffenswerk [Jahrtausend] -- zweistellige Nummer -- Teilkunstwerk.ext

und wie es nach der Neuordnung dargestellt werden müsste:

x:\Übergeordneter Ordner\Ordner\Jahrtausend - Schaffenswerk - zweistellige Nummer.ext


Wobei es nicht wirklich von Relevanz wäre, wenn die Ausgabe wieder mittels Doppelstrich realisiert werden würde. Das lässt sich denke recht problemlos
im nachhinein mittels "Ersetzen" abändern. Also nach der Ausgabe wurden Wörter/Objekte umgeordnet und Objekte bestimmter Positionen fallen gänzlich
weg.

Hehe, oh mann. Ich hoffe nach wie vor nicht durcheinander zu bringen oder irgendwie in die Irre zu führen...

Danke jedenfalls recht herzlich für dein Entgegenkommen Biber,

Grüße,

datasette =]
Mitglied: datasette
datasette 28.05.2010 um 09:39:05 Uhr
Goto Top
So, endlich Wochenende ;)

Hi LotPings und herzlichen Dank für deine Mühe hinsichtlich eines Lösungsvorschlags. Irgendwie komme ich mit der Anwendung des Quelltextes nicht so zurecht. Ich habe diesen 1:1 in eine Textdatei kopiert und als .bat abgespeichert. Nachdem ich die Datei ausführe erscheint die Ausgabe, dass die Umgebungsvariable -n "s| -- |#|gp" "%InFile%" nicht definiert ist; jedoch nur wenn ich sed in set abändere. Bei Verwendung mit d erscheint "Befehl falsch geschrieben oder nicht gefunden". Der Pfad zur Textdatei ist entsprechend angepasst. Auch meine Versuche Einfluss auf den Quelltext zu nehmen brachten (wie hätte es anders sein können) keinen Erfolg.

Vielleicht könntest Du in einer freien Minute bitte nochmal den Code ohne " -- " als Separator angleichen und die von Dir verwendete Raute "#" einbauen. Diesbezüglich müsste ich nur die zu bearbeitende Textdatei anpassen indem ich -- durch # ersetzen lasse. Wenn ich den Quelltext richtig deute, dann wäre die "fehlerhafte" Zeile nicht mehr notwendig oder?

Im Übrigen hier vielleicht nochmal der korrekte Pfad:

[IST] x:\Übergeordneter Ordner\Ordner -- Name [Datum]\Dateiautor -- Schaffenswerk [Datum] -- Nummer -- Titel.ext

[SOLL] x:\Übergeordneter Ordner\Ordner\Datum -- Schaffenswerk -- Nummer.ext


Bitte einfach nachhaken sollte es noch an Infos fehlen =)


Grüße,

datasette
Mitglied: 77559
77559 28.05.2010 um 09:56:28 Uhr
Goto Top
Hallo datasette,
mein Fehler nicht ausdrücklich darauf hingewiesen zu haben, das es sich bei sed um ein auf Windows portiertes GNU-Tool handelt.
Man kann die Ersetzung auch in ener Subroutine erledigen, was die Verarbeitung aber auch verlangsamt und etwas mehr Kodieraufwand erfordert.
Bei deinem obigen Soll ist unklar, welches Datum du übernehmen willst.

Bei dem von mir benutzten Sed handelt es sich um:
>sed --version
GNU sed version 4.1.2
Copyright (C) 2003 Free Software Foundation, Inc.
Die Version kann man sich hier herunterladen,
Dies is der direkte Download-Link.

Gruß
LotPings
Mitglied: datasette
datasette 31.05.2010 um 09:08:59 Uhr
Goto Top
Hallöchen,

und danke nochmals für die Mühe!

Leider kann ich mit dem Lösungsvorschlag nicht wirklich was anfangen. Habe mir die Lösung ein wenig einfacher vorgestellt. Möglicherweise habe ich eine Lösung für mein Problem mittels einer Software gefunden. Muss mich die Tage mal damit auseinandersetzen und dann weitersehen...


Liebe Grüße,

datasette =]
Mitglied: datasette
datasette 31.05.2010 um 23:36:56 Uhr
Goto Top
Falls noch jemand ein Lösungsvorschlag für einen DAU anzubieten hat, bin ich gerne offen dafür. Die Softwarevariante hat mir leider auch nicht weitergeholfen face-confused/

Grüße,

datasette
Mitglied: 77559
77559 31.05.2010 um 23:49:11 Uhr
Goto Top
Hallo datasette,

es war noch eine Frage offen bevor ich deine geänderte Anforderung berücksichtige.
Ein paar realistische Beispielszeilen wären auch nicht schlecht.

Gruß
LotPings
Mitglied: datasette
datasette 01.06.2010 um 00:17:54 Uhr
Goto Top
Hui, da is ja noch jemand wach face-smile

Ok, ich versuch mein Bestes; demnach hier der Versuch eines eindeutigen, realistischen Pfads:

x:\Künstler - H\Discjockey Hans-Joachim 007 # Kratzartistik [1988]\Discjockey Hans-Joachim 007 # Kratzartistik [1988] # 01 # Kratzen Bis Der Arzt Kommt.mp3
x:\Künstler - H\Discjockey Hans-Joachim 007 # Kratzartistik [1988]\Discjockey Hans-Joachim 007 # Kratzartistik [1988] # 02 # Rap Schlagbox.mp3
x:\Künstler - H\Discjockey Hans-Joachim 007 # Kratzartistik [1988]\Discjockey Hans-Joachim 007 # Kratzartistik [1988] # 03 # Em Ce Jodel.mp3
...
x:\Künstler - K\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961]\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961] # 01 # Schunkelaffäre.m4a
x:\Künstler - K\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961]\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961] # 02 # Gabi 'Granate' Gäbel's Scratch (Extended Version).m4a
x:\Künstler - K\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961]\Klaus Power & Seine Freunde # Schlager Haus Party 5 [1961] # 03 # Rappelkisten-Blues.m4a
...

Ausgabe:

x:\Künstler - H\Discjockey Hans-Joachim 007\1988 # Kratzartistik # 01.mp3
x:\Künstler - H\Discjockey Hans-Joachim 007\1988 # Kratzartistik # 02.mp3
x:\Künstler - H\Discjockey Hans-Joachim 007\1988 # Kratzartistik # 03.mp3
...
x:\Künstler - K\Klaus Power & Seine Freunde\1961 # Schlager Haus Party 5 # 01.m4a
x:\Künstler - K\Klaus Power & Seine Freunde\1961 # Schlager Haus Party 5 # 02.m4a
x:\Künstler - K\Klaus Power & Seine Freunde\1961 # Schlager Haus Party 5 # 03.m4a

Folgender Hintergrund; nachdem ich dem größten Teil meiner digitalisierten Schallplatten und MC Sammlung ID3-Tags verpasst habe und die Ordnerstruktur dahingehend
abgeändert habe stehe ich vor dem Problem eine nahezu unbrauchbare m3u-Playlist mit über 3000 Titeln/Dateipfaden zu haben. Da ich nicht jeden Pfad einzelnd anfassen
wollte dachte ich an eine komfortablere Lösung mittels Software...

Zu Deiner Frage mit dem Datum wird ersichtlich, das dies stets identisch ist.

Was vergessen?? ... wenn ja, dann einfach bemängeln =)


Grüße
Mitglied: 77559
77559 01.06.2010 um 10:00:32 Uhr
Goto Top
Moin datasette,

deine Antwort habe ich gestern aber nicht mehr mitbekommen face-wink

Wenn in der m3u ALLE Titel drin sein sollen, kannst du sie doch einfacher neu aufbauen?
Oder gibt es besondere Anforderungen in Bezug auf Auswahl, Reihenfolge?

Ich bin auch etwas verwirrt, jetzt sind doch wieder nur einfache Bindestriche mit Leerzeichen davor und dahinter?
Ich sprach auch von realitsischen Beispielen pm4 und m3p EWrweiterungen kenne ich nicht face-wink
Die &-Zeichen bedürfen in jedem Fall einer gesonderten Behandlung. Kommen ggfs auch noch <|> vor ?
Du hast im letzten Beispiel auch bei Discjockey Hans-Joachim 007 im Zielformat die 007 entfernt, was aber deinen bisherigen Angaben widerspricht.
Wenn deine Daten zu uneinheitlich sind, wirst du sie kaum automatisiert bearbeiten können.

Gruß
LotPings
Mitglied: datasette
datasette 01.06.2010 um 23:51:34 Uhr
Goto Top
Hehe, hallöle!

Ich habe o.g. Beispiel mal bearbeitet und angepasst. Es ist von meiner Seite her egal , ob als Separator ein " -- ", " - " oder " # " verwendet wird. In Abhängigkeit einer möglichen
Vereinfachung bei der Umsetzung könnte das jederzeit von mir angepasst werden.
Gehen wir in diesem Fall von oben dargestellten Beispiel aus -> LeerzeichenRAUTELeerzeichen
Erweiterung nun auch mit realistischem Bezug gesetzt. In Abhängigkeit des vorliegenden Formats.
Das &-Zeichen könnte zwecks Vereinfachung im gesamten Textfile temporär geg.ein anderes ersetzt werden;
die Zeichen <|> finden keine Verwendung.
Und das 007 ist versehentlich abhanden gekommen ;)

Wenn in der m3u ALLE Titel drin sein sollen, kannst du sie doch einfacher neu aufbauen?

Das würde bedeuten alle 3000+ Titel per Hand neu hinzuzufügen; oder war die Frage anders gemeint?

Grüße,
datesette =)
Mitglied: 77559
77559 03.06.2010 um 12:56:48 Uhr
Goto Top
Zitat von @datasette:
Ich habe o.g. Beispiel mal bearbeitet und angepasst. Es ist von meiner Seite her egal , ob als Separator ein " --
", " - " oder " # " verwendet wird. In Abhängigkeit einer möglichen
Vereinfachung bei der Umsetzung könnte das jederzeit von mir angepasst werden.
Ich bin da ja auch nicht so pingelig, aber die Batch Datei die das verarbeiten soll schon ...

Gehen wir in diesem Fall von oben dargestellten Beispiel aus -> LeerzeichenRAUTELeerzeichen
Erweiterung nun auch mit realistischem Bezug gesetzt. In Abhängigkeit des vorliegenden Formats.
Das &-Zeichen könnte zwecks Vereinfachung im gesamten Textfile temporär geg.ein anderes ersetzt werden;
die Zeichen <|> finden keine Verwendung.
Und das 007 ist versehentlich abhanden gekommen ;)
Soweit so gut, der For /f Befehl ist ja, mit etwas Einarbeitung, auch nicht sooo schwer zu verstehen.
Von Biber, bastla und Konsorten gibt es dazu reichlich Beispiele im Forum, wenn ich auch zugebe das es nicht immer einfach ist, die passenden Suchbegriffe zu wählen.
Ich verzichte jetzt mal darauf einen weiteren Aufguß zu schreiben face-wink
Wenn in der m3u ALLE Titel drin sein sollen, kannst du sie doch einfacher neu aufbauen?
Das würde bedeuten alle 3000+ Titel per Hand neu hinzuzufügen; oder war die Frage anders gemeint?
Ja, das war es face-wink
Der einfachste Weg eine m3u zu erstellen ist, einen Dir Befehl in eine Datei umzuleiten.
Je nachdem, in welcher Kodierung dein Player die Dateinamen erwartet, muss in der Batch ggfs noch die Code Page umgestellt werden.
Dir /B /S /A-D x:\*.mp3 X:\*.m3u >Alle.m3u

Wenn du nicht ein ganzes Laufwerk sondern nur die Künstlerbuchstaben in der m3u haben willst, erstellt diese Batch sowohl eine Gesamt- als auch eine Buchstaben-m3u. (ungetestet)
@Echo off&Setlocal
:: Wenn die Umlaute in der erstellten m3u nicht passen, 
:: testhalber die :: in der folgenen Zeile entfernen.
::Chcp 1252
Set "Basis=X:\K?nstler*"  
Set "AllM3U=X:\Alle.m3u"  
Type NUL >"%AllM3U%"  
For /f "delims=" %%A in (  
  'Dir /B/AD "%Basis%" 2^>Nul '  
    ) do Call :CreateM3U "%%~fA"  
Goto :Eof
:CreateM3U ----------------------------------------------------------
PushD %1
Set "ThisM3U=%~1\%~nx1.m3u"  
Type Nul >"%ThisM3U%"  
For /f "delims=" %%B in (  
  'Dir /B/S/A-D *.mp3 *.m4a'  
    ) Do Set "Song=%%B" & Call :AddSong  
popd
Goto :Eof
:AddSong ------------------------------------------------------------
:: Ampersand maskieren
Set "Song=%Song:&=^&%"  
>>"%AllM3U%"  Echo.%Song%  
>>"%ThisM3U%" Echo.%Song%  
Goto :Eof

Gruß
LotPings
PS: die Laufwerksbuchstaben "X:" musst du natürlich anpassen.
Mitglied: datasette
datasette 12.06.2010 um 16:43:18 Uhr
Goto Top
Hallöchen LotPings!

Ich wollte abschließend hierzu sagen, das ich nach etwas Fummelei eine für meine Zwecke geeignete
Lösung mittels Excel ausgetüftelt habe. Zwar habe ich dadurch ein wenig Nacharbeiten, aber diese sind
harmlos im Vergleich zur Vorstellung, die komplette Liste per Hand zusammenzustellen.

Danke vielmals an dieser Stelle für Deine Mühe und Deine Hilfsbereitschaft LotPings =]

...und ein schönes Wochenende gewünscht,

datasette