BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren
Hallo zusammen!
Ich bin neu hier und freue mich auf die Gesellschaft.
In meiner Frage geht es um eine Textdatei in der Messdaten ausgegeben werden.
Diese Textdatei sieht ungefähr so aus (gekürzt):
Anfang "UvM-Data.txt" ===========
X UniZug
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
X UniDruck
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
Ende "UvM-Data.txt" ===========
Aus diesen Wertetabellen (in der Datei sind noch mehr Wertetabellen enthalten) soll nun für jede Belastungsart eine neue Textdatei mit dem Inhalt der Wertetabelle erstellt werden.
Es sollen also mehrere Textdateien nach folgendem Schema erstellt werden:
Anfang "UniZug.txt" ===========
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
Ende "UniZug.txt" ============
Anfang "UniDruck.txt" ===========
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
Ende "UniDruck.txt" ===========
Nach ausgiebiger Suche bin ich soweit, dass ich mit der Batch-Datei die Zeile finde, in der die jeweilige Überschrift steht. Nun nöchte ich die übernächste Zeile und die darauf folgenden Zeilen mit Zahlenwerten kopieren und in eine neue Textdatei schreiben. Hier meine Batch-Datei dazu:
Anfang "Export.bat" ===========
for /f "delims=" %%i in ('findstr /N /C:"UniDruck" UvM-Data.txt') do @(
::echo %%i
for /F "tokens=1 delims=:" %%a in ("%%i") do @(
echo %%a>>temp.txt
)
)
Ende "Export.bat" ===========
Ist das eine sinnvolle Vorgehensweise, oder macht man das besser anders?
Wie geht es dann weiter?
Gruß
Manuel
Ich bin neu hier und freue mich auf die Gesellschaft.
In meiner Frage geht es um eine Textdatei in der Messdaten ausgegeben werden.
Diese Textdatei sieht ungefähr so aus (gekürzt):
Anfang "UvM-Data.txt" ===========
X UniZug
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
X UniDruck
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
Ende "UvM-Data.txt" ===========
Aus diesen Wertetabellen (in der Datei sind noch mehr Wertetabellen enthalten) soll nun für jede Belastungsart eine neue Textdatei mit dem Inhalt der Wertetabelle erstellt werden.
Es sollen also mehrere Textdateien nach folgendem Schema erstellt werden:
Anfang "UniZug.txt" ===========
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
Ende "UniZug.txt" ============
Anfang "UniDruck.txt" ===========
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
Ende "UniDruck.txt" ===========
Nach ausgiebiger Suche bin ich soweit, dass ich mit der Batch-Datei die Zeile finde, in der die jeweilige Überschrift steht. Nun nöchte ich die übernächste Zeile und die darauf folgenden Zeilen mit Zahlenwerten kopieren und in eine neue Textdatei schreiben. Hier meine Batch-Datei dazu:
Anfang "Export.bat" ===========
for /f "delims=" %%i in ('findstr /N /C:"UniDruck" UvM-Data.txt') do @(
::echo %%i
for /F "tokens=1 delims=:" %%a in ("%%i") do @(
echo %%a>>temp.txt
)
)
Ende "Export.bat" ===========
Ist das eine sinnvolle Vorgehensweise, oder macht man das besser anders?
Wie geht es dann weiter?
Gruß
Manuel
Please also mark the comments that contributed to the solution of the article
Content-Key: 315799
Url: https://administrator.de/contentid/315799
Printed on: April 26, 2024 at 07:04 o'clock
9 Comments
Latest comment
Hi
Regards
@echo off
set "sourcefile=C:\source\file.txt"
set "targetfolder=C:\data"
powershell -Executionpolicy ByPass -Command "[regex]::matches((gc -LiteralPath '%sourcefile%' | out-string),'(?ism)^X ([^\r\n]+)\s*(.*?)(?:^\s*$)') | %%{set-content \"%targetfolder%\$($_.Groups[1].Value).txt\" -Value $_.Groups[2].Value}"
Small typo , sorry. Is corrected above.
Here, it works. You have min PS 3.0 ?
Hallo Manuel,
ich finde die von Highload benutzte Regular Expression sehr
beeindruckend aber der Powershell One-liner ist nicht einfach
nachzuvollziehen.
Der von Ihm benutzte Algorythmus geht davon aus das jede Gruppe
mit X+Leerzeichen beginnt und der string dahinter den Namen
bestimmt.
Ich mach es in meiner Batch genauso. Ich gehe auch davon aus
das es immer 2 Werte pro Zeile sind - dann braucht die for-
Schleife keinen delims da das Leerzeichen Standard ist.
Gruß
LotPings
ich finde die von Highload benutzte Regular Expression sehr
beeindruckend aber der Powershell One-liner ist nicht einfach
nachzuvollziehen.
Der von Ihm benutzte Algorythmus geht davon aus das jede Gruppe
mit X+Leerzeichen beginnt und der string dahinter den Namen
bestimmt.
Ich mach es in meiner Batch genauso. Ich gehe auch davon aus
das es immer 2 Werte pro Zeile sind - dann braucht die for-
Schleife keinen delims da das Leerzeichen Standard ist.
Gruß
LotPings
:: Separieren.cmd:::::::::::::::::::::::::::::::::::::::::::::
:: LotPings administrator.de 2016-09-22 17:52
@echo off & setlocal EnableDelayedExpansion
Set Src=.\UvM-Data.txt
Set Dst=.
Set Out=NUL
For /f "tokens=1-2" %%A in ('Type %Src%') do Call :Sepa %%A %%B
Goto :EOF
:Sepa Str1 Str2
If /i "%1" equ "X" (
Set Out=%Dst%\%2.txt
Type NUL>!Out!
) Else (
>>!Out! Echo:%1 %2
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
UvM-Data.txt
X UniZug
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
X UniDruck
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
UniDruck.txt
0. 0.
-60.0746E-03 346.298E-03
-120.054E-03 4.63884
-180.118E-03 6.83768
-240.101E-03 8.86943
-300.E-03 11.1258
UniZug.txt
0. 0.
60.0746E-03 200.462E-03
120.054E-03 251.156E-03
180.118E-03 300.457E-03
240.101E-03 344.593E-03
300.E-03 381.287E-03
Hallo Manuel,
Laufwerk S: ist bei mir eine RamDisk - das hat sonst keine weitere Bewandnis,
ich habe es oben auf "." das aktuelle Verzeichnis geändert.
Gruß
LotPings
Laufwerk S: ist bei mir eine RamDisk - das hat sonst keine weitere Bewandnis,
ich habe es oben auf "." das aktuelle Verzeichnis geändert.
Gruß
LotPings