Batch problem (beim auslesen mehrerer .txt Dateien)
Problem mit dem sammeln von informationen aus mehreren txt dateien und diese dann in ein txt file zu packen
hallo liebe Community,
mir wurde die Aufgabe erteilt eine batch datei zu basteln die 2 Informationen aus vielen (hunderten) einzel txt files zusammenfügt und in eine neue datei (txt) packt!
habe nun schon einige versuche gewagt jedoch immer nur mit mäßigen Erfolg vielleicht könnt ihr mir ja weiterhelfen.
Beschreibung:
Die .txt Files befinden sich alle in einem Ordner die dateien heißen alle ungefähr gleich beginnent mit einem d und enden mit einem c
Bsp.:
d1234c
in diese txt Files sind einige Informationen drin die nicht bennötigt werden zum auswerten (z.b. pings und server adressen)
Wichtig in den txt files ist nur die erste und letzte Stelle. D.h. in zeile 1 steht der name und in der letzten Zeile ein Datum!
bsp.:
d1234c
10.10.2010
Diese beiden Informationen sollen nun in eine extra txt file gepackt werden (kopiert werden)... da es sich hier um nicht nur eine Datei handelt sondern um viele bin ich an der stelle etwas ratlos wie ich in einem Batch file angeben kann das er mehr als nur eine Datei öffnen und der die entsprechenden Einträge suchen soll... oder anders gefragt ist dies überhaupt möglich und wenn ja wie?
Hoffe auf eure Hilfe
Liebe Grüße
euer Soga
hallo liebe Community,
mir wurde die Aufgabe erteilt eine batch datei zu basteln die 2 Informationen aus vielen (hunderten) einzel txt files zusammenfügt und in eine neue datei (txt) packt!
habe nun schon einige versuche gewagt jedoch immer nur mit mäßigen Erfolg vielleicht könnt ihr mir ja weiterhelfen.
Beschreibung:
Die .txt Files befinden sich alle in einem Ordner die dateien heißen alle ungefähr gleich beginnent mit einem d und enden mit einem c
Bsp.:
d1234c
in diese txt Files sind einige Informationen drin die nicht bennötigt werden zum auswerten (z.b. pings und server adressen)
Wichtig in den txt files ist nur die erste und letzte Stelle. D.h. in zeile 1 steht der name und in der letzten Zeile ein Datum!
bsp.:
d1234c
10.10.2010
Diese beiden Informationen sollen nun in eine extra txt file gepackt werden (kopiert werden)... da es sich hier um nicht nur eine Datei handelt sondern um viele bin ich an der stelle etwas ratlos wie ich in einem Batch file angeben kann das er mehr als nur eine Datei öffnen und der die entsprechenden Einträge suchen soll... oder anders gefragt ist dies überhaupt möglich und wenn ja wie?
Hoffe auf eure Hilfe
Liebe Grüße
euer Soga
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 127008
Url: https://administrator.de/contentid/127008
Ausgedruckt am: 23.11.2024 um 11:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo soga307 und willkommen im Forum!
Unter der Annahme, dass es sich jeweils um komplette Zeilen handelt, etwa so;
Soferne diese Zeilen noch zerlegt werden müssen, wäre vorweg zu klären, nach welchen Kriterien die Zerlegung erfolgen soll.
Grüße
bastla
Unter der Annahme, dass es sich jeweils um komplette Zeilen handelt, etwa so;
@echo off & setlocal
set "Erg=D:\Ergebnis.txt"
set "Ordner=D:\Daten"
if exist "%Erg%" del "%Erg%"
for %%i in ("%Ordner%\d*c.txt") do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set /p Zeile1=<%1
for /f "usebackq delims=" %%a in (%1) do set "ZeileN=%%a"
>>"%Erg%" echo %Zeile1%_%ZeileN%
goto :eof
Grüße
bastla
Moin soga307,
willkommen im Forum.
Wenn du dir die Aufgabenstellung in kleinen Häppchen vornimmst, dann ist es gar nicht so schwer..
Also, es gibt irgendwo ein Laufwerk, einen Pfad und darin interessieren uns nur die Dateien "d*c.txt".
Und wir gehen mal davon aus, dass wir die einzeln anfassen müssen, also ist eine FOR-Anweisung das richtige Batch-Werkzeug.
Mach den ersten Test am CMD-Prompt, ob kein Denkfehler dabei war:
Jede einzelne gefundene d*c.txt-Datei %i hat eine erste Zeile und eine letzte Zeile, die dich interessieren.
Die erste Zeile einer Textdatei bekommst du am CMD-Prompt/im Batch mit
Die letzte Zeile einer Textdatei bekommst Du wiederum mit einer FOR/F-Anweisung:
Alle Beispiele sind für den proof-of-concept am CMD-Prompt.
Deshalb haben alle Laufvariablen (%i) nur EIN Prozentzeichen vor dem Buchstaben.
In einem Batch müssen es deren zwei sein (%%i)
Grüße
Biber
[Edit] Hallo bastla!
Menno, sogar die FDP hat sich total gewandelt ("...ist jetzt in der Realität angekommen..", heisst es in den Nachrichten.)
Aber du überholst immer noch rechts wie eh und je ...
[Edit]
willkommen im Forum.
Wenn du dir die Aufgabenstellung in kleinen Häppchen vornimmst, dann ist es gar nicht so schwer..
Also, es gibt irgendwo ein Laufwerk, einen Pfad und darin interessieren uns nur die Dateien "d*c.txt".
Und wir gehen mal davon aus, dass wir die einzeln anfassen müssen, also ist eine FOR-Anweisung das richtige Batch-Werkzeug.
Mach den ersten Test am CMD-Prompt, ob kein Denkfehler dabei war:
FOR %i in (D:\EinPfad\ZuDenLogfies\d*c.txt) do @echo %i
-oder-
FOR %i in ("D:\Ein Pfad mit Leerzeichen\Zu Den Logfies\d*c.txt" ) do @echo %i
Jede einzelne gefundene d*c.txt-Datei %i hat eine erste Zeile und eine letzte Zeile, die dich interessieren.
Die erste Zeile einer Textdatei bekommst du am CMD-Prompt/im Batch mit
Set /p "zeile1=<D:\eineGefundeneDatei.txt"
Echo %zeile%
-- oder, wenn es getestet ist natürlich
Echo %zeile% >>m:\eine\NeueDatei.txt
FOR /F "delims=" %i in (D:\Eine\textdatei.txt) do Set "letzteZeile=%i"
Echo %letzteZeile%
Alle Beispiele sind für den proof-of-concept am CMD-Prompt.
Deshalb haben alle Laufvariablen (%i) nur EIN Prozentzeichen vor dem Buchstaben.
In einem Batch müssen es deren zwei sein (%%i)
Grüße
Biber
[Edit] Hallo bastla!
Menno, sogar die FDP hat sich total gewandelt ("...ist jetzt in der Realität angekommen..", heisst es in den Nachrichten.)
Aber du überholst immer noch rechts wie eh und je ...
[Edit]
@Biber
Grüße
bastla
Aber du überholst immer noch rechts wie eh und je ...
Leicht zu erklären (Stichwort "Massenträgheit") ... Grüße
bastla
Moin pf1203,
wenn du eine Variation einer lösung willst, die vor 8 Jahren state of the art war: meinetwegen.
Dazu haben wir auch ein paar Beiträge zu dem Thema "Jede x-te Zeile mit FOR/F rausfieseln" - bitte mal suchen.
Sinngemäß ginge es (am CMD-Prompt) bei einer Beispieldatei z.B. so:
Also mit Find /n oder FindStr/n eine zeilennumerierte Version der *.txt-Datei nutzen.
Bei Find/n würde die gesuchte Zeile 3 als "3: eigentlicher Zeileninhalt" vorligen, bei Find/n als "[3] eigentlicher Zeileninhalt".
Aber: mach lieber einen neuen Beitrag auf, dann bekommst du auch ein etwas zeitgemäßere Lösung (z.B. Powershell).
Grüße
Biber
wenn du eine Variation einer lösung willst, die vor 8 Jahren state of the art war: meinetwegen.
Dazu haben wir auch ein paar Beiträge zu dem Thema "Jede x-te Zeile mit FOR/F rausfieseln" - bitte mal suchen.
Sinngemäß ginge es (am CMD-Prompt) bei einer Beispieldatei z.B. so:
for /f "tokens=1,* delims=:" %i in ('findstr /n $ beispiel.txt') do @if "%i"=="3" echo.%j
Also mit Find /n oder FindStr/n eine zeilennumerierte Version der *.txt-Datei nutzen.
Bei Find/n würde die gesuchte Zeile 3 als "3: eigentlicher Zeileninhalt" vorligen, bei Find/n als "[3] eigentlicher Zeileninhalt".
Aber: mach lieber einen neuen Beitrag auf, dann bekommst du auch ein etwas zeitgemäßere Lösung (z.B. Powershell).
Grüße
Biber
Moin Biber,
danke für deine schnelle Antwort.
An sich funktioniert die Lösung, die du mir geschickt hast.
Aber wie setz ich das jetzt in den Code von Bastla ein, damit ich mehrere Dateien in einem Ordner auslesen kann?
Klar wäre eine zeitgemäßere Lösung sinnvoller, aber mein Cheffe will das mit einer Batch, keine Ahnung wieso...
Danke dir schonmal.
Grüße
pf1203
danke für deine schnelle Antwort.
An sich funktioniert die Lösung, die du mir geschickt hast.
Aber wie setz ich das jetzt in den Code von Bastla ein, damit ich mehrere Dateien in einem Ordner auslesen kann?
Klar wäre eine zeitgemäßere Lösung sinnvoller, aber mein Cheffe will das mit einer Batch, keine Ahnung wieso...
Danke dir schonmal.
Grüße
pf1203
Moin pf1203,
wenn sich deine Anforderungen ansonsten mit denen der oben angegebenen decken (außer bei dir zeile 3 statt erste und letzte Zeile), dann sollte es reichen, in bastlas Skript die Zeile 11 (die "Arbeitszeile" in :Processfile) durch meine zu ersetzen.
Alles ungetestet, nur durch Copy&Paste zusammengestöpselt.
Und für deinen Chef: "Batchprocessing" im Jahre 2017 ist durchaus auch Powershell.
Ein wirklicher Grund, es NICHT mit Powershell zu machen wäre, wenn dieses bei euch im Unternehmen nicht eingesetzt werden darf.
Grüße
Biber
wenn sich deine Anforderungen ansonsten mit denen der oben angegebenen decken (außer bei dir zeile 3 statt erste und letzte Zeile), dann sollte es reichen, in bastlas Skript die Zeile 11 (die "Arbeitszeile" in :Processfile) durch meine zu ersetzen.
@echo off & setlocal
set "Erg=D:\Ergebnis.txt"
set "Ordner=D:\Daten"
if exist "%Erg%" del "%Erg%"
for %%i in ("%Ordner%\d*c.txt") do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set /p Zeile1=<%1
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ "%1"') do @if "%%i"=="3" echo.%%j>>"%Erg%"
goto :eof
Alles ungetestet, nur durch Copy&Paste zusammengestöpselt.
Und für deinen Chef: "Batchprocessing" im Jahre 2017 ist durchaus auch Powershell.
Ein wirklicher Grund, es NICHT mit Powershell zu machen wäre, wenn dieses bei euch im Unternehmen nicht eingesetzt werden darf.
Grüße
Biber