manuel1234
Goto Top

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

Content-Key: 315799

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

Printed on: April 26, 2024 at 07:04 o'clock

Mitglied: 129813
Solution 129813 Sep 21, 2016 updated at 08:38:38 (UTC)
Goto Top
Hi
@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}"  
Regards
Member: Manuel1234
Manuel1234 Sep 21, 2016 at 11:25:55 (UTC)
Goto Top
Hi Highload

Danke für deine schnelle Hilfe. Leider ist der Code nicht selbsterklärend und bei der Ausführung erscheint eine Fehlermeldung im Command-Window:

C:\source>call highload.bat
Fehlende ")" im Methodenaufruf.  
Bei Zeile:1 Zeichen:69
+ [regex]::matches((gc -LiteralPath 'C:\source\file.txt' | out-string) <<<< '(?  
ism)^X ([^\r\n]+)\s*(.*?)(?:^\s*$)') | targetfolder\$($_.Groups[1].Value).txt"  
-Value $_.Groups[2].Value}
    + CategoryInfo          : ParserError: (CloseParenToken:TokenId) , Paren
   tContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall


Mein Batchfile sah aus wie folgt:
@echo off
set "sourcefile=C:\source\file.txt"  
set "targetfolder=C:\source\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}"  
Mitglied: 129813
129813 Sep 21, 2016 updated at 11:30:42 (UTC)
Goto Top
Small typo , sorry. Is corrected above.
Member: Manuel1234
Manuel1234 Sep 21, 2016 at 11:45:20 (UTC)
Goto Top
I changed the code too.
Now no error is promted, but nothing happens ...
Mitglied: 129813
129813 Sep 21, 2016 at 11:55:03 (UTC)
Goto Top
Here, it works. You have min PS 3.0 ?
Member: Manuel1234
Manuel1234 Sep 22, 2016 at 10:02:34 (UTC)
Goto Top
Yes, it is PS 3.0 and I run the batch with ".\call:<batchname>" ...
Mitglied: 77559
Solution 77559 Sep 22, 2016 at 16:32:29 (UTC)
Goto Top
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

:: 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
Member: Manuel1234
Manuel1234 Sep 26, 2016 at 08:19:02 (UTC)
Goto Top
Hallo LotPings

Das ist genau das, was ich brauche. Vielen Dank!
Allerdings verstehe ich noch nicht, warum Highloads Powershell bei mir nicht läuft ...

Eine Frage habe ich noch:
In Deinem Batch hast Du einen Absoluten Pfad angegeben. Wie muss der für einen relativen Pfad aussehen?


Gruß
Manuel
Mitglied: 77559
Solution 77559 Sep 26, 2016 at 19:06:40 (UTC)
Goto Top
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