tardezyx
Goto Top

Mittels Batch bestimmte Information aus unbekannter Textdatei auslesen und in XML-Datei schreiben

Hallo,

es sind innerhalb eines Verzeichnisses sehr viele Unterordner vorhanden, in denen sich jeweils eine Textdatei befindet, deren Strukturen sich allerdings voneinander unterscheiden (es gibt keine eindeutige oder klar definierte Grammatik). In den Textdateien befindet sich allerdings eine Webadresse, die wie folgt aufgebaut ist: example.com/whatever/aa1234567/. Hier unterscheidet sich jeweils nur der letzte Teil ("aa1234567"), den ich gerne auslesen und in eine neue Textdatei mit eindeutiger Grammatik und immer gleichen Namen in den jeweiligen Unterordner schreiben möchte (XML). Falls die Webadresse gefunden und geschrieben worden ist, soll die unstrukturierte Textdatei gelöscht werden - anderenfalls nicht.

Beispiele:

TEXTFILE 1:

some gabberish
content in no
particular order
...
mr jack loves onions. gnignigni. example.com/whatever/aa5463429/ who thought of this.
...

XML-File 1:

<?xml version="1.0" encoding="utf-8"?> 
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <id>aa5463429</id>
</entry>


TEXTFILE 2:

...
...http://www.example.com/whatever/aa8167252/...
...

XML-File 2:

<?xml version="1.0" encoding="utf-8"?> 
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <id>aa8167252</id>
</entry>

usw. usf.

Danke & Gruß!

Content-ID: 240434

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

Ausgedruckt am: 25.11.2024 um 15:11 Uhr

Xaero1982
Xaero1982 09.06.2014 aktualisiert um 10:07:19 Uhr
Goto Top
!Achtung: Die Textdatei wird mit diesem Code tatsächlich gelöscht! Bitte nur bei Probematerial testen!
Moin,

unter der Annahme, dass die Textdatei immer gleich heißt:

@echo on
SETLOCAL enabledelayedexpansion

set xml=1.xml
set txt=1.txt

for /d %%i in (*) do (for /f "tokens=3 delims=/" %%a in ('findstr "example.com" %%i\*.txt') do set ganze_zeile="<?xml version="1.0" encoding="utf-8"?> <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <id>%%a</id></entry>") && echo !ganze_zeile:~1,-2! >>%%i\%xml% && if exist %%i\%xml% del %%i\%txt%  

Gruß
bastla
Lösung bastla 09.06.2014 aktualisiert um 21:31:14 Uhr
Goto Top
Hallo tardezyx!

Meine Interpretation Deiner Angabe würde etwa folgenden Ansatz ergeben:
@echo off & setlocal
set "Basis=D:\Dein Verzeichnis mit den vielen Unterordnern"  
set "Such=example.com"  

pushd "%Basis%"  
for /f "delims=" %%i in ('findstr /ims "%Such%" *.txt') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
for /f "delims=" %%a in ('findstr /i "%Such%" %1') do set "Zeile=%%a"  
call set "String=%%Zeile:*%Such%=%%"  
for /f %%a in ("%String%") do for %%w in ("%%a.") do set "Wert=%%~nxw"  
if not defined Wert echo Wert in %1 nicht gefunden & goto :eof
set "xml=%~dpn1.xml"  
(
    echo ^<?xml version="1.0" encoding="utf-8"?^>  
    echo ^<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"^>  
    echo   ^<id^>%Wert%^</id^>
    echo ^</entry^>
)>"%xml%"  
echo del %1
goto :eof
Vorausgesetzt habe ich, dass der Link (zB "http://www.example.com/whatever/aa8167252/") immer mit "/" endet und keine Leerzeichen enthält, vom restlichen Text in der Zeile (so es solchen gibt) aber durch jeweils mindestens ein Leerzeichen getrennt ist.

Das Löschen der Textdatei ist derzeit noch nicht "scharf geschaltet" (siehe das "echo" vor dem "del"), sondern gibt den Löschbefehl zum Testen nur aus.

Grüße
bastla
tardezyx
tardezyx 09.06.2014 um 18:11:29 Uhr
Goto Top
Danke euch beiden.

@Xaero1982: Deine Lösung holt zwar die korrekte Information, aber das Erzeugen der XML und das Löschen funktioniert nicht ganz so korrekt wie bei der Lösung von bastla, da bei dir auch alle anderen Dateien in dem Unterordner gelöscht werden (wieso auch immer) und die Zeilenumbrüche nicht ganz hinhauen.

@bastla: Bei deiner Lösung wird beim Finden der Information direkt die Quelldatei mit den XML-Daten gefüllt und überschrieben. Ein Löschen ist hier also nicht mehr notwendig. Das finde ich noch eleganter als zwei Dateien zu haben und dann eine zu löschen.

Ich habe dahingehend noch eine Zusatzfrage. Mit einem Drittprogramm werden anhand der ermittelten ID weitere Informationen in die XML geschrieben, von denen ich <title> und <year> gerne zum Umbenennen des Unterordners und aller dort vorhandenen Dateien nutzen möchte (Dateiendungen sind immer unique - es ist also kein Problem, sie gleich zu benennen). Derzeit mache ich das mühsam manuell.

Beispiel:

Suchverzeichnis
- Subdir 1
--- Subfile 1.* (Datendatei, Dateityp unbekannt/unwichtig)
--- Subfile 1.nfo (die XML)
- Subdir 2
--- Subfile 2.* (Datendatei, Dateityp unbekannt/unwichtig)
--- Subfile 2.nfo (die XML)
- usw. usf.

Subfile 1.nfo enthält nun folgende Informationen:

<?xml version="1.0" encoding="utf-8"?>  
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  <id>tt1276962</id>
  <title>Projekt ASDF</title>
...
  <year>2005</year>
...
</entry>

Es soll daraufhin wie folgt umbenannt werden:

Suchverzeichnis
- Projekt ASDF (2005)
--- Projekt ASDF (2005).* (Datendatei, Dateityp unbekannt/unwichtig)
--- Projekt ASDF (2005).nfo (die XML)
- Subdir 2
--- Subfile 2.* (Datendatei, Dateityp unbekannt/unwichtig)
--- Subfile 2.nfo (die XML)
- usw. usf.

Es sollen also <title> und <year> zu einem String verknüpft und dabei <year> umklammert werden. Hinzu kommt aber eine Besonderheit durch die Ordner- & Dateinamensbeschränkung, bei der bestimmte Zeichen nicht erlaubt sind. Diese Zeichen kommen freilich nur im <title> vor und müssten im String wie folgt ersetzt werden:

- "<" mit "("
- ">" mit ")"
- "/" mit "-"
- "|" mit "-"
- "\" mit "-"
- ":" mit " -" (inkl. Leerzeichen vor dem "-")
- "*" mit "" (also weg)
- "?" mit "" (also weg)

Ferner können (bei einer späteren Nachpflege) in den Unterordnern die folgenden drei Dateien mit bestimmten Endungen vorkommen, dies wären:

Projekt ASDF (2005)-farufl.*
Projekt ASDF (2005)-postiori.*
Projekt ASDF (2005)-tralarus.*

Diese Endungen müssten bei der Umbenennung erhalten bleiben.

Danke nochmal und Gruß!