webtix
Goto Top

Bestimmte Teile einer TXT Datei per Batch in eine neue CSV speichern

Hallo zusammen,

ich bekomme von einem externen Dienstleister in unregelmäßigen Abständen TXT Files mit verschiedenen Werten. Diese sind immer mit einem Semikolon getrennt.
Diese TXT Dateien kopiere ich mir bereits mit einem Programm automatisch in ein weiteres Verzeichnis, damit ich mit diesen arbeiten kann.

Jetzt muss ich aus diesen TXT Files jeweils den 5. und 7. Eintrag heraus filtern und in eine CSV Datei mit beliebigem Namen auf einem weitern Verzeichnis abspeichern.
Diese Daten benötige ich, damit ich diese in ein weiteres Programm importieren kann.

Inhalt einer Beispiel TXT:

E921;E904;0170131785;10;0000539789;;EL-X-5950/EL-F-2212;Remarks;Seals : 1262176 t/m 1262180 + 1262950;;20170627;06:43;20170627;08:01;15000;24900;1859


In diesem Beispiel soll also folgendes heraus geflitert werden:

Eintrag 5: 0000539789
Eintrag 7: EL-X-5950/EL-F-2212


Die CSV soll bspw. so am Ende aussehen:

|0000539789|;|EL-X-5950/EL-F-2212|

Kann mir jemand behilflich sein, wie ich dies bspw. über ein Batch Script realisiert bekomme, welches nach dem oben genannten Kopiervorgang der TXT ausgeführt wird?

Content-Key: 341737

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

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: 133417
133417 27.06.2017 aktualisiert um 13:01:26 Uhr
Goto Top
Nimm besser gleich PowerShell
$data = @((gc 'c:\daten.txt')).split(";")  
"|$($data[4])|;|$($data[6])|" | sc 'c:\fertig.csv'  
Gruß
Mitglied: Webtix
Webtix 27.06.2017 um 11:18:24 Uhr
Goto Top
@133417: Ich habe es soeben ausprobiert, jedoch wird keine CSV Datei erstellt und die Powershell wirft mir auch keinen Fehler aus.

habe es in meinem Fall mal mit dem lokalen "D" Drive probiert. Hier der Befehl:

PS D:\> $data = @(gc 'd:\daten.txt).split(";") "|$($data[4])|;|$($data[6])|" | sc 'd:\fertig.csv'

Mitglied: 133417
133417 27.06.2017 aktualisiert um 13:02:15 Uhr
Goto Top
Kein Wunder wenn du das in einer Zeile in die Shell pastest face-smile.
Das gehört in zwei Zeilen, oder beide Zeilen mit ; in einer Zeile zusammenfassen! Btw. fehlt dir zusätzlich ein Hochkomma, geht einwandfrei, it's your fault.
Mitglied: Webtix
Webtix 27.06.2017 um 13:38:32 Uhr
Goto Top
Danke für den Hinweis face-wink hatte wohl nen Brett vorm Kopf face-wink

vielleicht hast du auch eine Idee, wie ich das generisch für alle Files machen kann, welche sich zum Ausführ Zeitpunkt in dem Verzeichnis befinden und nicht nur für eine bestimmte TXT?

Nach erfolgreicher CSV Erstellung (Ablage in einem anderen Verzeichnis) würde ich dann gerne direkt die TXT Files im QuellVerzeichnis löschen

Möchte das fertige Script dann anschliessend gerne mit einem geplanten Task hinterlegen, welcher alle 2 oder 5 Minuten ausgeführt wird.
Mitglied: 133417
133417 27.06.2017 aktualisiert um 14:46:12 Uhr
Goto Top
vielleicht hast du auch eine Idee, wie ich das generisch für alle Files machen kann, welche sich zum Ausführ Zeitpunkt in dem Verzeichnis befinden und nicht nur für eine bestimmte TXT?
Klar, einfach mit Get-ChildItem alle Textdateien holen und dann mit Foreach-Schleife verarbeiten, fertig.
gci 'd:\quelle\*.txt' | ?{!$_.PSIsContainer} | %{  
    $data = @((gc $_.Fullname)).split(";")  
"|$($data[4])|;|$($data[6])|" | sc "d:\ziel\$($_.Basename).csv"  
    del $_.Fullname -Force
}
Mitglied: Webtix
Webtix 27.06.2017 um 14:45:00 Uhr
Goto Top
Ich musste das "-File" weglassen, damit es bei mir klappt...jedoch nimmt er sich jetzt nur eine TXT Datei und erstellt mir somit natürlich auch nur eine CSV Datei, welche folgenden Namen hat: $($_.Basename).csv

Das nachträgliche Löschen funktioniert.
Mitglied: 133417
133417 27.06.2017 aktualisiert um 14:47:03 Uhr
Goto Top
Dann hast du noch das alte PS 2.0, hab's oben für dich korrigiert.
Mitglied: 133417
133417 28.06.2017 um 14:16:02 Uhr
Goto Top