Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textfile sortieren

Frage Entwicklung Batch & Shell

Mitglied: Superjota

Superjota (Level 1) - Jetzt verbinden

12.04.2013 um 10:45 Uhr, 1578 Aufrufe, 11 Kommentare

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??
Mitglied: hmarkus
12.04.2013 um 11:24 Uhr
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
Bitte warten ..
Mitglied: Superjota
12.04.2013 um 13:12 Uhr
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!!
Bitte warten ..
Mitglied: 106543
12.04.2013 um 13:26 Uhr
Hi @Superjota,

warum einfach, wenn´s kompliziert geht
ö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

Fertig :D

Grüße
Exze

PS: ich denke das war das was @hmarkus meinte :D
Bitte warten ..
Mitglied: Superjota
12.04.2013 um 13:57 Uhr
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.
Bitte warten ..
Mitglied: hmarkus
12.04.2013, aktualisiert um 14:02 Uhr
Zitat von 106543:
...
PS: ich denke das war das was @hmarkus 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
Bitte warten ..
Mitglied: 106543
12.04.2013 um 14:00 Uhr
Wenn das so ist, könnnte man (wenn´s nicht unbedingt Batch sein muss) mit Powershell arbeiten 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
Bitte warten ..
Mitglied: Biber
12.04.2013, aktualisiert 13.04.2013
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
Bitte warten ..
Mitglied: Superjota
12.04.2013 um 16:52 Uhr
Hallo Herr Bieber

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!!
Bitte warten ..
Mitglied: Biber
12.04.2013, aktualisiert um 19:38 Uhr
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.

Ungetestet (weil das Wochenende ruft):

01.
:: -- dieser Batch möge "zslog2csv.cmd" heissen  
02.
:: und im selben Verzeichnis wie deine Original-Logfile liegen. 
03.
@Echo off & setlocal enableDelayedExpansion  
04.
Set "inputlog=D:\ein\verzeichnis\zsrun_original.log" & REM hier den Namen ändern 
05.
 
06.
FOR /f %%i in (%inputlog%) do if "%%i"=="zsrun" ( 
07.
             if defined csvzeile (  
08.
               echo !csvzeile! 
09.
               set "csvzeile=%%i" 
10.
             ) else set "csvzeile=%%i" 
11.
          ) else (  
12.
               if "%%i" NEQ "--" set "csvzeile=!csvzeile!,%%i" 
13.
          ) 
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
Bitte warten ..
Mitglied: Superjota
12.04.2013 um 23:25 Uhr
Biber,
Super habe das was ich brauch jetzt kann ich’s integrieren.
Bitte warten ..
Mitglied: hmarkus
13.04.2013 um 21:46 Uhr
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
01.
/--/!H 
02.
/--/{ 
03.
04.
s/\n/,/g 
05.
s/^--// 
06.
s/^,// 
07.
08.
09.
10.
}
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Outlook & Mail
gelöst Einige Outlook 2016 Anwendungsfragen Sortieren Aktionen (5)

Frage von Geforce zum Thema Outlook & Mail ...

VB for Applications
gelöst Spalten nach Titel sortieren (2)

Frage von Anrion zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...