weiti89
Goto Top

Batchdatei - Tabellen erstellen aus beliebig vielen Textdateien

Hallo, ich habe eine große Filmsammlung (aktuell 255, es werden ständig mehr). Um den Überblick zu behalten würde ich gerne eine Tabelle (zB Excel) erstellen in der die Filmtitel und das Genre enthalten sind, als spalten der Tabelle. Da es immer mehr werden, möchte ich die Tabelle jederzeit mit allen Filmen neu erstellen.
Die Filme liegen folgendermaßen vor: Ordner "Filme" darin sind Unterordner, jeweils ein Unterordner pro Film. Der Unterordner heißt wie der Film. Im Unterordner liegt jeweils eine Datei Filmname.divx sowie eine EPG.txt. Die EPG.txt enthält in der ersten Zeile den Filmnamen, in der zweiten das Genre, in den anderen Zeilen eine Beschreibung. Die erste und zweite Zeile sollen ausgelesen und als exel gespeichert werden.

Bisher bin ich soweit, das ich alle Filmtitel speichere mit:

Dir /A /B /N /W /TC > ~DateiListe.xls

im Verzeichnis \Filme in der Window- Shell
Allerdings greife ich nur auf die Ordnernamen zu, nicht auf die txt Dateien darin

Folgende Probleme hab ich:
- ich muss in alle Unterordner
- Ich muss auf Zeileninhalte der txt zugreifen
- ich muss beim speichern als Tabelle angeben was in welche Zeile/Spalte kommt

Content-Key: 108753

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

Printed on: April 24, 2024 at 17:04 o'clock

Mitglied: 60730
60730 Feb 11, 2009 at 20:40:34 (UTC)
Goto Top
Servus,

schau dir mal was fix und fertiges an, wie z.B die Variante.

Macht deutlich mehr Spass einen Barcodeleser an die Hülle dran zu halten und das war dann schon fast alles, was man[n] machen muß face-wink

Gruß
Member: weiti89
weiti89 Feb 11, 2009 at 21:09:24 (UTC)
Goto Top
mhm, ne. Meine Filme sind Videoaufnahmen aus dem Fernsehen. Da gibt es keine Barcodes. und manuell alle Filme per Hand eintragen will ich ja vermeiden.
Member: bastla
bastla Feb 11, 2009 at 21:10:10 (UTC)
Goto Top
Hallo weiti89 und willkommen im Forum!

Du könntest es mit folgendem Batch versuchen:
@echo off & setlocal
set "Basis=D:\Filme"  
set "Liste=%Basis%\Liste.csv"  

>"%Liste%" echo "Filmname";"Genre"  
for /d %%i in ("%Basis%\*.*") do call :ProcessDir "%%i"  
"%Liste%"  
goto :eof

:ProcessDir
set "EPG=%~1\EPG.txt"  
set /p Filmname=<"%EPG%"  
set Genre=
for /f "usebackq skip=1 delims=" %%a in ("%EPG%") do if not defined Genre set "Genre=%%a"  
>>"%Liste%" echo "%Filmname%";"%Genre%"  
goto :eof
Erstellt wird keine "echte" Excel-Datei, sondern eine CSV, welche aber direkt mit Excel geöffnet werden kann (und durch Zeile 7 des Batches auch wird). Durch ein einfaches "Speichern unter..." mit Auswahl des gewünschten Typs ".xls" erhältst Du dann auch das gewünschte Excel-File.

Grüße
bastla

P.S.: Ein "DIR /A /B", oder besser "DIR /AD /B", sollte auch genügen; "/N" "/W" und "/TC" ändern hier nichts am Ergebnis ...
Member: weiti89
weiti89 Feb 11, 2009 at 21:30:34 (UTC)
Goto Top
Danke erstmal!
ich habe "Basis=E:\Externe\Filme" in Zeile 2 angepasst. Es klappt ganz gut, nur stehen bei vielen (schätze 25%) Zwei Einträge, einmal mit Genre und einmal ist die Genre-Zeile leer.
Bsp.:

EPG.txt:

BORAT (BORAT: CULTURAL LEARNINGS OF AMERICA FOR MAKE BENEFIT GLORIOUS NATION OF KAZAKHSTAN) >>U
Komödie>>/U
Seine Schwester ist die[...]
USA 2006. 81 Min. Von Larry Charles, mit Sacha Baron Cohen, Kevin Davitian, Daniel Castro.

Die Zeilenumbrüche habe ich extra markiert mit >>U

Das meißte kann ich nachvollziehen, aber was macht set "Genre=%%a" ?

ps: spaßige fehler wenn die EPG.txt falsch formatiert ist face-smile
JOHNNY ENGLISH hat als Genre "Armes Großbritannien!"
Member: bastla
bastla Feb 11, 2009 at 21:41:39 (UTC)
Goto Top
Hallo weiti89!

Wenn ich Dein "Borat"-Beispiel in eine "EPG.txt" schreibe, wird bei mir nur eine Zeile daraus ...

Könnte es sein, dass es im Original keine Windows-Zeilenumbrüche (CR/LF) sind?

Vielleicht ließe sich der zweite Eintrag (wenn Genre leer bleibt) so vermeiden: Ersetze Zeile 15 durch:
if  defined Genre >>"%Liste%" echo "%Filmname%";"%Genre%"
was macht set "Genre=%%a" ?
Mit "Genre=%%a" wird die ausgelesene zweite Zeile der EPG.txt der Variablen %Genre% zugewiesen.
Probleme könnte es übrigens auch geben, wenn ein Filmtitel (im Genre wird's wohl eher nicht der Fall sein) ein "&" (oder "<", ">" bzw "|") enthält. Um dem vorzubeugen, solltest Du noch vor Zeile 15 einfügen:
set "Filmname=%Filmname:&=^&"
- analog auch für die anderen genannten Sonderzeichen ...

Grüße
bastla
Member: weiti89
weiti89 Feb 11, 2009 at 21:58:30 (UTC)
Goto Top
Die If abfrage klappt wunderbar. Danke!
Die Zeilenumbrüche werden von einem Aufnahme-Programm so erstellt, daher weiß ich nicht genau was für welche es sind. der Editor zeigt sie mir aber auch immer als Umbrüche an.

Was steht in %%a? was heißt delim?

Eigentliches Problem ist soweit geklärt. Vielen Dank.
Member: bastla
bastla Feb 11, 2009 at 22:11:16 (UTC)
Goto Top
Hallo weiti89!

Vorweg ein Hinweis grundsätzlicher Art: Mit "for /?" (und analog für andere CMD-Befehle) kannst Du die Online-Hilfe aufrufen (speziell zu "for" ist diese ziemlich umfangreich) ...
Die ganze Zeile
for /f "usebackq skip=1 delims=" %%a in ("%EPG%") do if not defined Genre set "Genre=%%a"
hat folgende Aufgabe:
"Lese die in der Variablen "%EPG%" (damit diese, für den Fall dass der Ordnername Leerzeichen enthalten sollte, unter Anführungszeichen gesetzt werden kann, wird "usebackq" benötigt) angegebene Datei zeilenweise aus, ohne die jeweilige Zeile zu zerlegen (es wird festgelegt, dass es kein Trennzeichen = "delimiter" geben soll), überspringe die Zeile 1 und schreibe das Ergebnis (jeweils die komplette Zeile) in die Variable %%a bzw in weiterer Folge in %Genre%".

Da bei jedem Durchlauf (also für alle Zeilen ab der zweiten Zeile) auf diese Art und Weise jeweils nicht nur %%a, sondern auch %Genre% einen neuen Wert erhielte, wird zunächst die Variable %Genre% gelöscht und dann sicher gestellt, dass ihr nur ein Wert zugewiesen wird, wenn sie noch keinen hat - was nur auf den ersten Schleifendurchlauf (und daher für Zeile 2) zutrifft.

Grüße
bastla