limitbreaker
Goto Top

Dateien einzeln einlesen und verarbeiten

Hallo,
Dank der Hilfe von bastla habe ich mir folgende Batch zusammen gebastelt.

@echo off & setlocal
set Anzahl=0
for /f %%i in ('dir /s "Input\*.txt" 2^>nul^|findstr "Datei(en)"') do set "Anzahl=%%i"  
>Output\Output1.txt findstr /g:Suchliste.txt Input\Input1.txt
set "Datei=Output\Output1.txt"  
set "Suche=[0-3][0-9]\.[0-1][0-9]\.[0-9][0-9][0-9][0-9]_[0-9][0-9]	Analyst  : 	Administrator"  
set "T=%temp%\Output1.txt"  
move "%Datei%" "%T%"  
(for /f "usebackq delims=" %%i in ("%T%") do (  
    set "Zeile=%%i"  
    setlocal enabledelayedexpansion
    echo !Zeile!|findstr /erc:"%Suche%">nul && (  
        echo !Zeile:~,-40!
    ) || (
        echo !Zeile!
    )
    endlocal
))>"%Datei%"  

Das Programm soll nun anstatt der Eingabe Input1.txt und Ausgabe Output1.txt alle Textdateien in dem Verzeichnis Input sowie den Unterverzeichnissen einlesen und die verarbeiteten Dateien in den Ordner Output ablegen. Die Ordnerstruktur hinter dem Ordner Input soll dabei erhalten bleiben. Das heißt falls noch nicht vorhanden soll das Programm im Ordner Output die Unterordner erstellen damit die Struktur gleich bleibt.
Ich habe am Anfang schonmal die Anzahl der Dateien eingelesen da ich mir dachte, dass man die Dateien mit einer For-Schleife von 1 bis %Anzahl% verarbeiten kann.
Gruß
limitbreaker

Content-Key: 188109

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

Printed on: April 25, 2024 at 15:04 o'clock

Member: Darkprodukt
Darkprodukt Jul 16, 2012 updated at 19:08:38 (UTC)
Goto Top
So habs mal versucht hinzubekommen. Hier das Ergebniss ...
@echo off & setlocal 
type >StrukturIn.txt
type >StrukturOrdner.txt

::Hier das Abspeichrn der Struktur
for /f "delims=" %%i in ('dir /a-s-h-d /b /s "Imput\*.txt"') do echo %%~i>>StrukturIn.txt  

::Das ändern von Imput in Output
>"withunderlines" (for /f "usebackq delims=" %%i in ("StrukturIn.txt") do set "Line=%%i" ^   
  &setlocal enabledelayedexpansion ^
  &set "Line=!Line:Imput=Output!" ^  
  &(echo(!Line!) ^
  &endlocal
)
move "withunderlines" "StrukturOut.txt"  

::Das erstellen der Output Struktur
for /f "delims=" %%i in ('dir /a-s-h-d /b /s "Imput\*.txt"') do echo %%~dpi>>StrukturOrdner.txt  

::Das ändern von Imput in Output
>"withunderlines" (for /f "usebackq delims=" %%i in ("StrukturOrdner.txt") do set "Line=%%i" ^   
  &setlocal enabledelayedexpansion ^
  &set "Line=!Line:Imput=Output!" ^  
  &(echo(!Line!) ^
  &endlocal
)
move "withunderlines" "StrukturOrdner.txt"  

::Erstellen der Ordnerstruktur
for /f %%i in ("StrukturOrdner.txt") do mkdir %%i  

::Und jezt mit der Liste Weiterarbeiten so in etwa.
for /f %%i in ("StrukturOut.txt") do set "Datei=%%i" ^  
  &set "Suche=[0-3][0-9]\.[0-1][0-9]\.[0-9][0-9][0-9][0-9]_[0-9][0-9]	Analyst  : 	Administrator" ^  
  &(for /f "usebackq delims=" %%i in ("StrukturIn.txt") do (  
    set "Zeile=%%i"  
    setlocal enabledelayedexpansion
    echo !Zeile!|findstr /erc:"%Suche%">nul && (  
        echo !Zeile:~,-40!
    ) || (
        echo !Zeile!
    )
    endlocal
))>"%Datei%"  

::Löschen der unnötigen Datei
if exist StrukturIn.txt del StrukturIn.txt
if exist StrukturOut.txt del StrukturOut.txt
if exist StrukturOrdner.txt del StrukturOrdner.txt

exit 0

Da gibts bestimmt noch einiges zu verbessern, aber das hab ich mal soweit hinbekommen.
Ich versuche mal das noch weiter zu verbessern.

Ich weiß noch nicht wo ich deine Zeile 4 hinpacken muss ^^

Grüße
Darkprodukt
Member: bastla
bastla Jul 16, 2012 updated at 19:36:46 (UTC)
Goto Top
Hallo Darkprodukt!

Guter Ansatz mit dem Ersetzen des "Input"-Pfades durch den "Output"-Pfad face-smile (ich hätte zwar eher den relativen Pfad unterhalb des "Input"-Ordners ermittelt und damit die Zielordnerstruktur erstellt, aber übernehme das trotzdem mal so); ansonsten sollte sich das etwas kompakter formulieren lassen - ungetestet etwa:
@echo off & setlocal
set "Ein=D:\Input"  
set "Aus=D:\Output"  
set "Liste=D:\Suchliste.txt"  
set "Suche=[0-3][0-9]\.[0-1][0-9]\.[0-9][0-9][0-9][0-9]_[0-9][0-9]	Analyst  : 	Administrator"  

for /f "delims=" %%a in ('dir /s/b/a-d "%Ein%\*.txt"') do set "PfadAlt=%%a" & call :ProcessFile "%%a"  
goto :eof

:ProcessFile
call set "PfadNeu=%%PfadAlt:%Ein%=%Aus%%%"  
for /f "delims=" %%i in ("%PfadNeu%") do md "%%~dpi" 2>nul  
(for /f "delims=" %%i in ('findstr /g:"%Liste%" %1') do (  
    set "Zeile=%%i"  
    setlocal enabledelayedexpansion
    echo !Zeile!|findstr /erc:"%Suche%">nul && (  
        echo !Zeile:~,-40!
    ) || (
        echo !Zeile!
    )
    endlocal
))>"%PfadNeu%"  
goto :eof
Grüße
bastla

[Edit] "usebackq" in Zeile 13 entfernt [/Edit]
Member: limitbreaker
limitbreaker Jul 16, 2012 updated at 19:29:44 (UTC)
Goto Top
Hallo Zusammen,
Danke für den Lösungsansatz Darkprodukt.
Ich war grade dabei diesen zu verstehen als bastla dazu kam.
Habe dann das Skript von bastla getestet.
Die Ordnerstruktur wird soweit übernommen.
Leider steht in jeder Textdatei des Output Ordners:
findstr /g:Suchliste.txt "Pfad zur richtigen Input Datei\Datei.txt"

Also was bei dir in '' in Zeile 13 steht @ bastla.
Gruß
limitbreaker
Member: Darkprodukt
Darkprodukt Jul 16, 2012 updated at 19:38:12 (UTC)
Goto Top
@bastla
Schön, wie immer schenke ich dir Bewunderung,
aber ist das nicht so das jezt Imput und Output dirkt auf der Patition D liegen müssen?

Ich dachte es sind einfach 2 Ordner die unterhalb der Batch liegen.
Deswegen auch das umständliche ersetzen.

Grüße
Darkprodukt
Member: bastla
bastla Jul 16, 2012 updated at 19:51:20 (UTC)
Goto Top
Hallo limitbreaker!

Lass mal "usebackq" weg (habe ich inzwischen oben auch rausgenommen) ...

Grüße
bastla
Member: bastla
bastla Jul 16, 2012 updated at 20:03:18 (UTC)
Goto Top
Hallo Darkprodukt!
aber ist das nicht so das jezt Imput und Output dirkt auf der Patition D liegen müssen?
Nein - es genügt, den jeweililgen Pfad anzugeben ...
Ich dachte es sind einfach 2 Ordner die unterhalb der Batch liegen.
Deswegen auch das umständliche ersetzen.
Könnten sie natürlich auch - dann würde ich den relativen Pfad ermitteln (obwohl auch hier das direkte Ersetzen möglich wäre):
call set "PfadRel=%%PfadAlt:%cd%\Input\=%%"  
md "Output\%PfadRel%\.." 2>nul  
...
))>"Output\%PfadRel%"  
Grüße
bastla
Member: limitbreaker
limitbreaker Jul 16, 2012 updated at 19:51:26 (UTC)
Goto Top
Hallo bastla,
Läuft, du alter bastler face-wink
Hallo Darkprodukt, die Ordnerstruktur hast du dir richtig verstanden.
Habe einfach in Skript vom bastla den Pfad angepasst.

Danke euch Beiden nochmal für eure Mühen & Hilfe.
Freue mich, das es nun läuft.

PS: Kann man irgentwie noch einfügen, dass er die Bearbeitungen nur durchführt werden sofern die jeweilige Datei im Output Ordner noch nicht vorhanden ist? (Denke da einfach an Bearbeitungszeit und Rechenleistung nach bei einer stetig anwachsenden Datei Anzahl.)

Gruß
limitbreaker
Member: bastla
bastla Jul 16, 2012 updated at 19:56:33 (UTC)
Goto Top
Hallo limitbreaker!

Freut mich, wenn's passt ... face-smile
Kann man irgentwie noch einfügen, dass er die Bearbeitungen nur durchführt sofern die jeweilige Datei im Output Ordner noch nicht vorhanden ist?
Füge nach Zeile 11 ein:
if exist "%PfadNeu%" goto :eof
Grüße
bastla
Member: limitbreaker
limitbreaker Jul 16, 2012 at 19:58:25 (UTC)
Goto Top
Alles klar bastla,
Fetten Danke nochmal.
Habs schon getestet läuft =)
Sehr gut!

Gruß
limitbreaker