superjota
Goto Top

Textfile sortieren

Hallo Zusammen,

ich habe ein Batch Problem und mich hier schon umgesehen, aber immernoch keine Lösung gefunden.
Deswegen wollte ich jetzt mal in einem neuen Beitrag euch um Hilfe bitten.

Ich habe ein Textfile der von einer Steuerungsmaschiene entsteht. Dieses möchte ich in ein CSV Format konvertieren um dann gewisse Berechnungen zu machen.
Mein Problem ist das der Textfile in unterstehenden Linien aufgelistet wird. Ich müsste diese in horizontalen Format bringen und mit Beistriche getrennt.

Beispiel :
*
--
zsrun
205
CalibrationExeronUPC_Low_0
CalibrationProbe_0
Referenzsystem
Referenzsystem
Referenzsystem
--
zsrun
204
10044-09012-FS-4-N1_0
09012_EL-ZB_FS-EI-001-N-020_3
--
zsrun
25888
10044-09012-FS-4-N1_0
09012_EL-ZB_FS-EI-001-N-020_1
--
zsrun
190
CalibrationExeronUPC_Low_0
CalibrationProbe_0
Referenzsystem
Referenzsystem
Referenzsystem



Ergebnis sollte so aussehen:


zsrun ,205,CalibrationExeronUPC_Low_0 ,CalibrationProbe_0 ,Referenzsystem ,Referenzsystem ,Referenzsystem
zsrun ,204,10044-09012-FS-4-N1_0 ,09012_EL-ZB_FS-EI-001-N-020_3
zsrun ,25888,10044-09012-FS-4-N1_0 ,09012_EL-ZB_FS-EI-001-N-020_1
zsrun ,190,CalibrationExeronUPC_Low_0 ,CalibrationProbe_0 ,Referenzsystem ,Referenzsystem ,Referenzsystem
*


Kann mir jemand behilflich sein??

Content-Key: 204888

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

Printed on: April 19, 2024 at 06:04 o'clock

Mitglied: 64748
64748 Apr 12, 2013 at 09:24:25 (UTC)
Goto Top
Hallo,

von Batch hab ich keine Ahnung. Aber Du musst einfach die Zeilenumbrüche durch ',' (Komma) ersetzen und dann '--' durch einen Zeilenumbruch (in der Reihenfolge). Dann hast Du das gewünschte Ergebnis.

Markus
Member: Superjota
Superjota Apr 12, 2013 at 11:12:21 (UTC)
Goto Top
Ja dazu müsste ich aber den "Zeilenumbruch" in einer "FOR" schleife ausfündig machen.
und diesen dann ersetzten und in ein neuen txt exportieren.
Ich komm da einfach mit meinen Kenntnissen nicht weiter!!
Mitglied: 106543
106543 Apr 12, 2013 at 11:26:24 (UTC)
Goto Top
Hi @Superjota,

warum einfach, wenn´s kompliziert geht face-smile
öffne diese Log im Texteditor, klicke oben auf Bearbeiten -> Ersetzen
dann machst du in deiner Textfile einen Zeilenumbruch, markierst diesen und kopierst den.
Dann fügst du ihn beim Feld "Suchen nach:" und bei "Ersetzen mit:" schreibst du "," (ohne Anführungszeichen).
Dann trägst du als Nächstes "--" in "Suchen nach:" ein und bei "Ersetzen mit:" wieder den Zeilenumbruch einfügen face-smile

Fertig :D

Grüße
Exze

PS: ich denke das war das was @64748 meinte :D
Member: Superjota
Superjota Apr 12, 2013 at 11:57:34 (UTC)
Goto Top
Hallo,
ja, so würde es für eine einmalige Änderung gehen. Ich bekomme aber jeden Tag ein neues Textfile und wollte es in automatisch über ein Skript oder Batch erstellen lassen.
Mitglied: 64748
64748 Apr 12, 2013 updated at 12:02:29 (UTC)
Goto Top
Zitat von @106543:
...
PS: ich denke das war das was @64748 meinte :D
im Prinzip ja. Wenn ich sowas im Editor mache (Vim), dann benutze ich Reguläre Ausdrücke. Es sieht dann so aus
:%s/\n/ ,/
das ersetzt jeden Zeilenumbruch durch " ," also Leerzeichen gefolgt von Komma und sieht dann so aus
-- ,zsrun  ,205  ,CalibrationExeronUPC_Low_0  ,CalibrationProbe_0  ,Referenzsystem  ,Referenzsystem  ,Referenzsystem  ,-- ,zsrun  ,204  ,10044-09012-FS-4-N1_0  ,09012_EL-ZB_FS-EI-001-N-020_3  ,-- ,zsrun  ,25888  ,10044-09012-FS-4-N1_0  ,09012_EL-ZB_FS-EI-001-N-020_1  ,-- ,zsrun  ,190  ,CalibrationExeronUPC_Low_0  ,CalibrationProbe_0  ,Referenzsystem  ,Referenzsystem  ,Referenzsystem , ,
Danach
:s/--/\r/g
ersetzt alle -- durch einen Zeilenumbruch und sieht dann so aus
 ,zsrun  ,205  ,CalibrationExeronUPC_Low_0  ,CalibrationProbe_0  ,Referenzsystem  ,Referenzsystem  ,Referenzsystem  ,
 ,zsrun  ,204  ,10044-09012-FS-4-N1_0  ,09012_EL-ZB_FS-EI-001-N-020_3  ,
 ,zsrun  ,25888  ,10044-09012-FS-4-N1_0  ,09012_EL-ZB_FS-EI-001-N-020_1  ,
 ,zsrun  ,190  ,CalibrationExeronUPC_Low_0  ,CalibrationProbe_0  ,Referenzsystem  ,Referenzsystem  ,Referenzsystem , ,

Markus
Mitglied: 106543
106543 Apr 12, 2013 at 12:00:46 (UTC)
Goto Top
Wenn das so ist, könnnte man (wenn´s nicht unbedingt Batch sein muss) mit Powershell arbeiten face-smile da gibt´s einfache Replace-Befehle
Syntax (wenn ich´s noch richtig weiß) Replace(String,das was weg soll,das was hin soll)

Grüße
Exze
Member: Biber
Biber Apr 12, 2013, updated at Apr 13, 2013 at 14:25:05 (UTC)
Goto Top
Moin Supejota,

willkommen im Forum.
Meiner Meinung nach ist es nicht so furchtbar komplex, den Krams über einen Mini-Batch abzufackeln.

Allerdings wären noch zwei, drei Gegebenheiten zu klären, die für mich nicht klar aus deiner Beispieldatei hervorgehen.
1) in deinem Textauszug existieren auch Zeilen mit dem Zeileninhalt "--". Diese sind wirklich so in der Originaldatei vorhanden und sollen entsorgt werden?
2) die Strings in den jeweiligen Zeilen habe ich der Einfachheit halber angenommen as je ein "Wort" bzw. Token. D.h. es kommen keine eingebetteten Leerzeichen in einer Zeile vor?
3) je erzeugter Csv-Zeile ergeben sich unterschiedliche Anzahl "Spalten" - mal drei, mal fünf. Die nachverabeitung funktioniert damit oder sollen ggf. "Leerspalten" bzw. Kommata angefügt werden.

Ein einfacher Oneliner als proof of concept vom CMD-Prompt aus macht aus deinem Logfilegelumpe,
das ich bei mir zsrun_original.log genannt habe, nach kurzer Vorbereitung:
D:\ein\Prompt>mode con cols=234 lines=45

...dieses hier:

D:\ein\Prompt>setlocal enableextension &for /f %i in (zsrun_original.log) do @if "%i"=="zsrun" (@if defined csvzeile ((@echo !csvzeile!) & @set "csvzeile=%i") else set "csvzeile=%i") else (if "%i" NEQ "--" set "csvzeile=!csvzeile!,%i")
zsrun,190,CalibrationExeronUPC_Low_0,CalibrationProbe_0,Referenzsystem,Referenzsystem,Referenzsystem
zsrun,205,CalibrationExeronUPC_Low_0,CalibrationProbe_0,Referenzsystem,Referenzsystem,Referenzsystem
zsrun,204,10044-09012-FS-4-N1_0,09012_EL-ZB_FS-EI-001-N-020_3
zsrun,25888,10044-09012-FS-4-N1_0,09012_EL-ZB_FS-EI-001-N-020_1

Grüße
Biber
Member: Superjota
Superjota Apr 12, 2013 at 14:52:55 (UTC)
Goto Top
Hallo Herr Bieber face-smile

1) Ja die "--" sind so enthalten diese Währen nämlich die Zeichen an denen man mit einer neuen Zeile anfangen muss.
2) ja Lehrzeichen sind uninteressant.
3) Das mal 3 und mal 5 spalten sind ist mir bewusst und mir den kann ich dann in CSV umgehen.

Das Ergebnis das Sie mir hier gegeben haben ist genau das was ich brauche.

Ich komme nur nicht zurecht mir den Batch. Sie haben das alles in einer Zeile gefasst, (zsrun_original.log)sollte der quelltext sein, oder? Die Ausgabe müsste ich dann in ein weiteres TXT File umleiten.??

im Voraus Dankend!!
Member: Biber
Biber Apr 12, 2013 updated at 17:38:47 (UTC)
Goto Top
Moin Superjota,

"Bieber" war ein ganz anderer Justin mit ganz anderen Frisurproblemen als ich sie habe - ich bin nur der "Biber". Ohne "ie" und auch ohne "Herr"

Ich hatte nur einen Schnellschuss vom CMD-Prompt aus gepostet.
Ja, besser is' das, wenn wir da ein paar wartbare Zeilen in einem Batch raus machen. face-wink

Ungetestet (weil das Wochenende ruft):

:: -- dieser Batch möge "zslog2csv.cmd" heissen  
:: und im selben Verzeichnis wie deine Original-Logfile liegen.
@Echo off & setlocal enableDelayedExpansion 
Set "inputlog=D:\ein\verzeichnis\zsrun_original.log" & REM hier den Namen ändern  

FOR /f %%i in (%inputlog%) do if "%%i"=="zsrun" (  
             if defined csvzeile ( 
               echo !csvzeile!
               set "csvzeile=%%i"  
             ) else set "csvzeile=%%i"  
          ) else ( 
               if "%%i" NEQ "--" set "csvzeile=!csvzeile!,%%i"  
          ) 

Ich habe jetzt nur eine neue Variable %inputlog% ergänzt, ein paar Zeilenumbrüche reingehäckt und alle Vorkommnisse von "%i" durch "%%i" ersetzt, weil ein Batch zwei Prozentzeichen statt einem braucht.

Wenn du bitte erstmal vom CMD-Prompt aus diesen Batch startest und dir das Ergebnis anguckst
-> also "zslog2csv.cmd" ohne Anführungszeichen eingeben dort, wo Batchschnipsel und deine Logdatei liegen

Wenn was Sinnvolles rauskommt, dann Umleiten mit "zslog2csv>d:\irgend\wohin\neueDatei.csv"
-oder natürlich diesen Basis-Schnipsel erstmal verfeinern (Logfilename als Parameter? Fehlerhandling? Direkt im Batch umleiten?)

Grüße
Biber
Member: Superjota
Superjota Apr 12, 2013 at 21:25:32 (UTC)
Goto Top
Biber, face-smile
Super habe das was ich brauch jetzt kann ich’s integrieren.
Mitglied: 64748
64748 Apr 13, 2013 at 19:46:12 (UTC)
Goto Top
Hallo nochmal,

es war so eine interessante Aufgabe und ich lese gerade das Buch sed && awk von Arnold Robbins. Deswegen hab ich noch eine Lösung mit sed zusammengebastelt:
sed -n '/--/!H; /--/{x;s/\n/,/g;s/^--//;s/^,//;p;d;h}' < textfile.txt
Man kann den Code auch in ein Skript schreiben
/--/!H
/--/{
x
s/\n/,/g
s/^--//
s/^,//
p
d
h
}
Wenn man das skript skript.sed nennt, dann gibt man es mit der -f Option an sed und der Aufruf erfolgt
sed -n -f skript.sed < textfile.txt
Die Ausgabe sieht dann so aus
zsrun ,205 ,CalibrationExeronUPC_Low_0 ,CalibrationProbe_0 ,Referenzsystem ,Referenzsystem ,Referenzsystem 
zsrun ,204 ,10044-09012-FS-4-N1_0 ,09012_EL-ZB_FS-EI-001-N-020_3 
zsrun ,25888 ,10044-09012-FS-4-N1_0 ,09012_EL-ZB_FS-EI-001-N-020_1 
Markus