Dateiname einer Datei um Wert aus einerCSV-Datei per Batch erweitern
Hallo an die Administratorenrunde. Ich benötige mal wieder eure Hilfe bei einer etwas kniffligen Angelegenheit. Leider habe ich im Netz bis jetzt keine Lösung gefunden.
Ich habe in einem Verzeichnis mehrere Dateien. Diese sind immer wie folgt aufgebaut:
Datei(1).MP3
Datei(1).CSV
Datei(2).MP3
Datei(2).CSV
Datei(3).MP3
Datei(3).CSV
Diese Dateien werden so beim Abspeichern von Audioaufzeichungen angelegt, wobei in den CSV-Datein immer die Verwaltungsdaten zum gleichnamigen Audiofile vorhanden sind.
Ich müßte nun die Dateinamen um einen Wert aus der entsprechenden CSV-Datei erweitern. Dieser steht immer in der der 2. Zeile der CSV-Datei als erster Wert (also vor dem ersten Komma).
Da es sich bei diesen Dateien durchaus um bis zu 100 Audioaufzeichnungen handelt, kann dieses schlecht von Hand erfolgen. Deshalb möchte ich dieses gerne über eine Batch-Datei realisieren.
Der Dateiordner, in dem die Dateien liegen, ist stehts ein anderer. Nach der Umbenennung sollten die Dateien wie folgt aussehen:
Datei_WertausCSV.PM3
Datei_WertausCSV.CSV
...
Ich hoffe, dass jemand dafür eine gute Idee hat.
Ich habe in einem Verzeichnis mehrere Dateien. Diese sind immer wie folgt aufgebaut:
Datei(1).MP3
Datei(1).CSV
Datei(2).MP3
Datei(2).CSV
Datei(3).MP3
Datei(3).CSV
Diese Dateien werden so beim Abspeichern von Audioaufzeichungen angelegt, wobei in den CSV-Datein immer die Verwaltungsdaten zum gleichnamigen Audiofile vorhanden sind.
Ich müßte nun die Dateinamen um einen Wert aus der entsprechenden CSV-Datei erweitern. Dieser steht immer in der der 2. Zeile der CSV-Datei als erster Wert (also vor dem ersten Komma).
Da es sich bei diesen Dateien durchaus um bis zu 100 Audioaufzeichnungen handelt, kann dieses schlecht von Hand erfolgen. Deshalb möchte ich dieses gerne über eine Batch-Datei realisieren.
Der Dateiordner, in dem die Dateien liegen, ist stehts ein anderer. Nach der Umbenennung sollten die Dateien wie folgt aussehen:
Datei_WertausCSV.PM3
Datei_WertausCSV.CSV
...
Ich hoffe, dass jemand dafür eine gute Idee hat.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 196663
Url: https://administrator.de/contentid/196663
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
13 Kommentare
Neuester Kommentar
Blutigen Anfängern, die bereit sind zu lernen muss natürlich geholfen werden
zur Erklärung:
Zeile 03: Variable, die den Pfad zu den Dateien enthält
Zeile 04: Variable, die die erste zu bearbeitende Dateiende csv enthält
Zeile 05: Variable, die die zweite zu bearbeitende Dateiende csv enthält
Zeile 06: Variable, die den neu zu bildenden Dateinamenszusatz enthalten wird
Zeile 08: Schleife über die alle csv-Dateien im Pfad und mit jeder Datei eine Unterprozeudr aufrufen
Zeile 12: Zeile 2 (more +1) der übergebenden csv-Datei ausgeben und daraus den Wert vor dem ersten Komma entnehmen (deshalb der for-Befehl mit dem Zeichentrenner "delims=,")
Zeile 15: im Datum/Uhrzeitstring Blank durch _ ersetzen
Zeile 16: im Datum/Uhrzeitstring . durch _ ersetzen
Zeile 17: im Datum/Uhrzeitstring : entfernen
Zeile 19: umbennenen der csv-Datei
Zeile 20: umbennenen der mp3-Datei
Momentan ist das Umbennenen in Zeilen 19 + 20 durch den vorangestellten echo-Befehl noch deaktiviert, es wird nur der auszuführende Befehl ausgegeben.
Also mal die Zeile 3 anpassen und laufenlassen. Wenn alles paßt: den echo in Zeile 19 + 20 raus.
Es geht bestimmt noch eleganter, aber so funktioniert es jedenfalls erstmal
noch ein Hinweis: um das Skript kurz zu halten sind momentan keinerlei Prüfungen drin, also z.B. ob zu einer csv-Datei auch eine mp3 vorhanden ist oder wenn das Skript 2 mal läuft würde der Dateiname 2 mal um Datum/Uhrzeit ergänzt.
Gruß Andi
@echo off & setlocal enabledelayedexpansion
set "dirpath=d:\temp"
set "fileext1=csv"
set "fileext2=mp3"
set "filenameext="
for /f %%a in ('dir /b %dirpath%\*.%fileext1%') do call :umbenennen %%a
goto :EOF
:umbenennen
for /f "delims=," %%b in ('more +1 %dirpath%\%1') do (
set "filenameext=%%b"
set "filenameext=!filenameext: =_!"
set "filenameext=!filenameext:.=_!"
set "filenameext=!filenameext::=!"
echo.
echo rename %dirpath%\%~n1.%fileext1% %~n1_!filenameext!.%fileext1%
echo rename %dirpath%\%~n1.%fileext2% %~n1_!filenameext!.%fileext2%
)
goto :eof
zur Erklärung:
Zeile 03: Variable, die den Pfad zu den Dateien enthält
Zeile 04: Variable, die die erste zu bearbeitende Dateiende csv enthält
Zeile 05: Variable, die die zweite zu bearbeitende Dateiende csv enthält
Zeile 06: Variable, die den neu zu bildenden Dateinamenszusatz enthalten wird
Zeile 08: Schleife über die alle csv-Dateien im Pfad und mit jeder Datei eine Unterprozeudr aufrufen
Zeile 12: Zeile 2 (more +1) der übergebenden csv-Datei ausgeben und daraus den Wert vor dem ersten Komma entnehmen (deshalb der for-Befehl mit dem Zeichentrenner "delims=,")
Zeile 15: im Datum/Uhrzeitstring Blank durch _ ersetzen
Zeile 16: im Datum/Uhrzeitstring . durch _ ersetzen
Zeile 17: im Datum/Uhrzeitstring : entfernen
Zeile 19: umbennenen der csv-Datei
Zeile 20: umbennenen der mp3-Datei
Momentan ist das Umbennenen in Zeilen 19 + 20 durch den vorangestellten echo-Befehl noch deaktiviert, es wird nur der auszuführende Befehl ausgegeben.
Also mal die Zeile 3 anpassen und laufenlassen. Wenn alles paßt: den echo in Zeile 19 + 20 raus.
Es geht bestimmt noch eleganter, aber so funktioniert es jedenfalls erstmal
noch ein Hinweis: um das Skript kurz zu halten sind momentan keinerlei Prüfungen drin, also z.B. ob zu einer csv-Datei auch eine mp3 vorhanden ist oder wenn das Skript 2 mal läuft würde der Dateiname 2 mal um Datum/Uhrzeit ergänzt.
Gruß Andi
@ andimue
"
Um nicht %dirpath% mitschleppen zu müssen, könntest Du vorweg
und nach der ersten Schleife das zugehörige
verwenden.
Grüße
bastla
"
delayedExpansion
" ist gar nicht nötig - Du kannst ja nur den Timestamp in der Schleife holen und den Rest außerhalb erledigen - in einer Fassung, die auch mehr als 2 Zeilen in der csv-Datei und Dateinamen/Pfade mit Leerzeichen verträgt (und falls im Originaldateinamen kein "_" vorkommt, auch gleich das Mehrfach-Umbenennen verhindert) etwa so:@echo off & setlocal
set "dirpath=d:\temp"
set "fileext1=csv"
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a"
goto :eof
:umbenennen
echo %1|findstr "_">nul && goto :eof
set "filenameext="
for /f "delims=," %%b in ('more +1 "%dirpath%\%~1"') do if not defined filenameext set "filenameext=%%b"
if not defined filenameext goto :eof
set "filenameext=%filenameext: =_%"
set "filenameext=%filenameext:.=_%"
set "filenameext=%filenameext::=%"
echo ren "%dirpath%\%~n1.*" "%~n1_%filenameext%.*"
goto :eof
pushd "%dirpath%"
popd
Grüße
bastla
@ bastla
Ich bin dir für deine konstruktiven Vorschläge wirklich dankbar. Das du beim Imbennenen mit .* arbeitest und so nicht die %fileext2% brauchst find ich gut. Auch die Idee, in der 2.Schleife nur das Datum/Uhrzeit rauszuziehen und so auf den "delayedExpansion" zu verzichten macht die Sache einfacher und durchschaubarer.
Der Befehl echo %1|findstr "_">nul && goto :eof ist auch ne gute Sache um ein doppeltes Umbennenen zu verhindern (ich hatte ja wie geschrieben keine Prüfungen reingebaut, um Mikro110 nicht zu sehr zu verwirren).
Die Ergänzung um den "if not defined" in der 2.for-Schleife ist gut und sinnvoll. Ich bin laut der Beschreibung davon ausgegangen, dass die csv-Datei nur 2 Zeilen hat. Aber so ist es auf jeden Fall sicherer.
Zu pushd und popd: die beiden Befehle hab ich irgendwie so garnicht auf dem "Schirm" wenn ich Prozeduren schreibe. Aber ich sollte sie wohl dringend in mein Repertoire aufnehmen
Freundliche Grüße
Andi
Ich bin dir für deine konstruktiven Vorschläge wirklich dankbar. Das du beim Imbennenen mit .* arbeitest und so nicht die %fileext2% brauchst find ich gut. Auch die Idee, in der 2.Schleife nur das Datum/Uhrzeit rauszuziehen und so auf den "delayedExpansion" zu verzichten macht die Sache einfacher und durchschaubarer.
Der Befehl echo %1|findstr "_">nul && goto :eof ist auch ne gute Sache um ein doppeltes Umbennenen zu verhindern (ich hatte ja wie geschrieben keine Prüfungen reingebaut, um Mikro110 nicht zu sehr zu verwirren).
Die Ergänzung um den "if not defined" in der 2.for-Schleife ist gut und sinnvoll. Ich bin laut der Beschreibung davon ausgegangen, dass die csv-Datei nur 2 Zeilen hat. Aber so ist es auf jeden Fall sicherer.
Zu pushd und popd: die beiden Befehle hab ich irgendwie so garnicht auf dem "Schirm" wenn ich Prozeduren schreibe. Aber ich sollte sie wohl dringend in mein Repertoire aufnehmen
Freundliche Grüße
Andi
Hi Mikro110,
bastlas Prozedur funktioniert deshalb, weil er deutlich sauberer programmiert als ich
Er hat überall, wo der Dateiname vorkommt diesen in "" eingeschlossen, also z.B. hier:
Er muss diese "" aber in der Unterprozeudr wieder entfernen und das macht er, indem er beim 2.for-Befehl diese Schreibweise nimmt: "%dirpath%\%~1" <-- hier kommt es auf die ~ an:
%~1 - Expandiert %1 und entfernt umschließende
Anführungszeichen (")
Erklärt wird dies in der Hilfe zum Befehl call ( also call /? am Prompt eingeben)
Für das Entfernen des Klammerteils aus dem Dateinamen kannst du z.B. den 2.for wie folgt abändern:
bastlas Prozedur funktioniert deshalb, weil er deutlich sauberer programmiert als ich
Er hat überall, wo der Dateiname vorkommt diesen in "" eingeschlossen, also z.B. hier:
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a"
%~1 - Expandiert %1 und entfernt umschließende
Anführungszeichen (")
Erklärt wird dies in der Hilfe zum Befehl call ( also call /? am Prompt eingeben)
Für das Entfernen des Klammerteils aus dem Dateinamen kannst du z.B. den 2.for wie folgt abändern:
for /f "tokens=1,3 delims=()" %%a in ("%~n1_%filenameext%") do ren "%dirpath%\%~n1.*" "%%a%%b.*"
Sorry,
mein Fehler
Es muss nicht die 2.for-Schleife geändert werden sondern der ren-Befehl muss in eine for-Schleife eingebettet werden. Hier nochmals die Lösung von bastla mit der notwendigen Änderung
mein Fehler
Es muss nicht die 2.for-Schleife geändert werden sondern der ren-Befehl muss in eine for-Schleife eingebettet werden. Hier nochmals die Lösung von bastla mit der notwendigen Änderung
@echo off & setlocal
set "dirpath=d:\temp"
set "fileext1=csv"
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a"
goto :eof
:umbenennen
echo %1|findstr "_">nul && goto :eof
set "filenameext="
for /f "delims=," %%b in ('more +1 "%dirpath%\%~1"') do if not defined filenameext set "filenameext=%%b"
if not defined filenameext goto :eof
set "filenameext=%filenameext: =_%"
set "filenameext=%filenameext:.=_%"
set "filenameext=%filenameext::=%"
for /f "tokens=1,3 delims=()" %%a in ("%~n1_%filenameext%") do echo ren "%dirpath%\%~n1.*" "%%a%%b.*"
goto :eof