PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tipp gesucht. Dateipfad aus Text löschen


Pennywise
2016-01-07, 20:20:47
Vorab, ich bin kein Programmierer also nicht lachen wenn das Problem einfach ist.
Ich habe eine Textdatei mit 1700 Dateipfaden. Die Pfade sind alle unterschiedlich lang und enden alle mit .mp3

Mein Problem, ich müsste die Dateinamen extrahieren, also aus

D:\OneDrive\Musik\Wünsche\Dead Kennedys-Holiday in Cambodia.mp3

Dead Kennedys-Holiday in Cambodia.mp3

... machen. Kann ich aber nicht, hab auch kein Tool gefunden. Unter Excel hab ich es probiert, hat auch nicht geklappt.

AwesomeSauce
2016-01-07, 20:36:27
Du könntest jede Zeile mit einer Regex matchen.

([^\\]+.mp3)$ (Ruby-Regex)

Sollte für die einfachsten Fälle genügen. Falls dir das nichts sagt, einfach melden, dann bastel ich dir ein Ruby-Skript. Hast du noch mehr Pfad-Beispiele?

LG

EDIT:

Folgendes Skript sollte genügen:

File.open ARGV[0], 'r' do |file|
file.each_line do |line|
puts line.match /([^\\]+.mp3$)/
end
end


Einfach Code in auf ".rb" endende Datei einfügen und per
ruby {dateiname.rb} {pfad_datei.txt} > {ausgabe_datei.txt}
ausführen. Die Resultate befinden sich dann in der {ausgabe_datei.txt}

Falls du Windows benutzt, kannst du hier (http://rubyinstaller.org/downloads/) Ruby 2.2.3 herunterladen.

Pinoccio
2016-01-07, 21:23:35
Notepad++ kann auch Regex. Einfach (.+\\)(.+) durch \2 ersetzen. (Dabei Reguläre Ausdrücke anhaken als Such/Ersetz-Option).

Erläuterung: Die runden Klammer sind Capturing Groups. Die erste Gruppe .+\\match (=findet) alles (den Punkt mit Quantifier +, der beliebig häufiges Vorkommen (mind. 1) angibt), solang bis es mit einem Backslash aufhört. Der Backslash ist eigentlich ein Sonderzeichen bei RegEx, was hier durch \\ umgangen wird. Die zweite Gruppe .+match wiederum alles. Die Ersetzung ersetzt dann Treffer, d.h. Gruppe 1 und Gruppe 2 durch nur Gruppe 2.
Es wird also alles bis einschließlich zum letzten Backslash entfernt. Unter Windows kann der Backslash nicht in Dateinamen auftauchen sonder ist Pfad-Trenner. Übrig bleibt also der Dateiname.

mfg

littlejam
2016-01-07, 22:33:47
Notepad++ kann auch Regex. Einfach (.+\\)(.+) durch \2 ersetzen. (Dabei Reguläre Ausdrücke anhaken als Such/Ersetz-Option).

Erläuterung: Die runden Klammer sind Capturing Groups. Die erste Gruppe .+\\match (=findet) alles (den Punkt mit Quantifier +, der beliebig häufiges Vorkommen (mind. 1) angibt), solang bis es mit einem Backslash aufhört. Der Backslash ist eigentlich ein Sonderzeichen bei RegEx, was hier durch \\ umgangen wird. Die zweite Gruppe .+match wiederum alles. Die Ersetzung ersetzt dann Treffer, d.h. Gruppe 1 und Gruppe 2 durch nur Gruppe 2.
Es wird also alles bis einschließlich zum letzten Backslash entfernt. Unter Windows kann der Backslash nicht in Dateinamen auftauchen sonder ist Pfad-Trenner. Übrig bleibt also der Dateiname.

mfg
Oder .+\\ durch nichts ersetzen ;-)
Aber sonst... ja notepad++ ist das richtige tool.

Grüße

Pinoccio
2016-01-07, 22:37:14
Oder .+\\ durch nichts ersetzen ;-)Das wäre zu einfach für eine Tool wie Regex (https://xkcd.com/1313/). :freak:

mfg

Monger
2016-01-08, 09:26:56
Nur der Vollständigkeit halber: viele Tools und Programmiersprachen haben ein natives Verständnis von Dateisystemen. Das kann man natürlich für sich nutzen, weil: ist gar nicht so einfach, via Regex alle Gegebenheiten zu berücksichtigen. Pfade ohne Anführungszeichen oder mit? Sonderzeichen? Spezielle Escape Zeichen? Was ist mit Umlauten, und Buchstaben aus dem erweiterten Zeichensatz (chinesische Schriftzeichen o.ä.)? Slashes oder Backslashes?

Die Lösung via Regex ist natürlich vollkommen okay. Aber um mal ne Alternative zu zeigen, die ganze Sache in Powershell:


Get-Content -Path D:\Temp.txt | foreach{ [System.IO.Path]::GetFileNameWithoutExtension($_)} | Out-File D:\Result.txt

Pennywise
2016-01-08, 09:42:59
Danke wusste auf euch ist Verlass :) probiere das später mal aus.

Pennywise
2016-01-11, 14:57:25
Also ich hab jetzt mit Notetab Plus ([^\\]+.mp3)$ ausprobiert. Klappt, aber es bleibt nur der Pfad über :D Wie stell ich das jetzt an das der Pfad gelöscht und der MP3 Dateiname stehen bleibt? danke noch mal.

Monger
2016-01-11, 16:04:52
Mach es so wie Pinoccio beschrieben hat. Achte darauf dass das was du ersetzst das richtige ist (in dem Fall \2 für die zweite Capturing Group).
Gibt ja zwei Wege zum Ziel:
a - du fischst die Dateinamen einzeln raus und schreibst sie in eine neue Datei
b - du suchst den Pfad vor jeder MP3, und ersetzt ihn durch nichts (bzw durch nichts plus Name).

b ist ein kleines bisschen anspruchsvoller.
Du hast jetzt quasi versucht einen Regex für a in einem b Szenario zu benutzen. Deshalb, wie gesagt: jetzt wo du dein Tool gewählt hast, folge Pinocchios Lösung.

Pennywise
2016-01-11, 18:44:31
Jo hatte ich ganz übersehen :) "Oder .+\\ durch nichts ersetzen ;-)" war es dann.

PHuV
2016-01-13, 09:44:37
Wie hast Du überhaupt diese Textdatei erzeugt?

Wenn Du das über die Eingabeaufforderung etc. gemacht hast, hättest Du schon beim Erstellen der Liste die Pfade bzw. die Datei separieren können.

Pennywise
2016-01-13, 11:35:58
Wie hast Du überhaupt diese Textdatei erzeugt?

Wenn Du das über die Eingabeaufforderung etc. gemacht hast, hättest Du schon beim Erstellen der Liste die Pfade bzw. die Datei separieren können.

Das war ein Programm zum löschen doppelter Mp3s. Das hat mir aber zuviel zerhauen, so dass ich die Dateien lieber wieder zurückschieben wollte. Die waren aber alle nun in einem Ordner und ich hatte noch den Originalpfad von der Löschanweisung.