Manipulation .txt mittels Batch-Script
[Update vom Webmaster] Reale Logfile-Daten gegen Fake-Daten ausgetauscht.
Hallo an Alle!
Demnach ihr mir schon einmal so perfekt geholfen habt, wende ich mich mit einem neuen Anliegen an euch:
Ich erhalte täglich mehrere Dateien auf einem Server überspielt, die ich via Batch-Skript manipulieren und via ftp übertragen will.
Der Dateiname variiert je nach Datum und Uhrzeit, auch die Endung kann verschieden aussehen (zb: .wts oder .nts oder .hts)
Hier ein Besipiel, wie so eine Datei aussehen kann:
Ich habe hier die Zeilennummern noch vorne mitangeschrieben (1:, 2:, usw.)
Wie man auch erkennen kann, ist es immer die gleiche Zahl an Datenfeldern je ausgefüllter Zeile (40 Felder), die mit Semikolon getrennt sind und alle Datenfelder (ausgenommen das Erste) beginnen mit einem einfachen Hochkomma.
Jetzt sollen an der Datei folgende Manipulationen vorgenommen werden (via Batch)
1) die Endung der Datei sollte auf .txt geändert werden
2) Wenn das Feld 3 leer ist (also '' steht - wie zB in Zeile 11
, dann sollte es mit einem Bindestrich gefüllt werden (also '-')
3) Wenn im Feld 34 ein Zeilenumbruch vorkommt, soll dieser gelöscht werden, so dass der Datensatz nur in einer Zeile steht
hier ein Beispiel:
4) Jede leere Zeile (wie im Beispiel 2, und 4) soll entfernt werden
5) neue Datei sollte vie FTP auf einem bestimmten Server in ein bestimmtes Verzeichnis geladen werden.
Ich hoffe, ihr könnt so einigermassen nachvollziehen, was ich vorhabe und könnt mir dabei helfen.
Ich bedanke mich schon mal im Voraus
lg James
Hallo an Alle!
Demnach ihr mir schon einmal so perfekt geholfen habt, wende ich mich mit einem neuen Anliegen an euch:
Ich erhalte täglich mehrere Dateien auf einem Server überspielt, die ich via Batch-Skript manipulieren und via ftp übertragen will.
Der Dateiname variiert je nach Datum und Uhrzeit, auch die Endung kann verschieden aussehen (zb: .wts oder .nts oder .hts)
Hier ein Besipiel, wie so eine Datei aussehen kann:
1:12007030088-2;'Case ';'Chevey ';'';'Onernstr 12/Top 10';'1040';'Wien';'21 344335';'';'Case ';'Wolfgang ';'';'Operng. 12/Top 10';'1010';'Wien';'01 9433978';'';'30';'01';'';'';'00';'';'07';'';'0';'';'';'4';'1.0';'103.00';'';'';'Lieferung 11-16 Uhr';'';'10';'';'';'';'02.03.1976'
2:
3:12007030093-3;'Sunny';'Michaeles';'';'Am Brunner.382/Top 32';'2023';'Limburg';'0633/555523';'';'Sunny';'Michaeles';'';'Am Brunner.382/Top 32';'2023';'Limburg';'0633/555523';'';'30';'01';'';'';'00';'';'07';'';'0';'';'';'28';'1.0';'444.00';'';'';'bitte 1Std. vor Lieferung anrufen';'';'10';'';'';'';'02.03.1999'
4:
Ich habe hier die Zeilennummern noch vorne mitangeschrieben (1:, 2:, usw.)
Wie man auch erkennen kann, ist es immer die gleiche Zahl an Datenfeldern je ausgefüllter Zeile (40 Felder), die mit Semikolon getrennt sind und alle Datenfelder (ausgenommen das Erste) beginnen mit einem einfachen Hochkomma.
Jetzt sollen an der Datei folgende Manipulationen vorgenommen werden (via Batch)
1) die Endung der Datei sollte auf .txt geändert werden
2) Wenn das Feld 3 leer ist (also '' steht - wie zB in Zeile 11
3) Wenn im Feld 34 ein Zeilenumbruch vorkommt, soll dieser gelöscht werden, so dass der Datensatz nur in einer Zeile steht
hier ein Beispiel:
1:12007030183-1;'Josty';'Dudaa';'';'Deppgasse 28/4/23';'1099';'Wien';'01234/5555 4';'';'Josty';'Dudaa';'';'Deppgasse 28/4/23';'1099';'Wien';'01234/5555 4';'';'30';'01';'';'';'00';'';'07';'';'0';'';'';'2';'1.0';'66.00';'';'';'bitte läuten bei Coolio Galerie
2:besser kurz vor Lieferung anrufen';'';'10';'';'';'';'03.01.1942'
3:
5) neue Datei sollte vie FTP auf einem bestimmten Server in ein bestimmtes Verzeichnis geladen werden.
Ich hoffe, ihr könnt so einigermassen nachvollziehen, was ich vorhabe und könnt mir dabei helfen.
Ich bedanke mich schon mal im Voraus
lg James
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53194
Url: https://administrator.de/forum/manipulation-txt-mittels-batch-script-53194.html
Ausgedruckt am: 22.04.2025 um 21:04 Uhr
6 Kommentare
Neuester Kommentar
Hallo James2870!
Für die Teilaufgaben 1) bis 4) könntest Du folgendes (oberflächlich getestetes) VBScript verwenden:
Das Script erwartet als einziges Argument die Ausgangsdatei (mit voller Pfadangabe). Diese wird - wie in 2) bis 4) erläutert - aufbereitet und unter dem gleichen Namen, aber mit dem Typ ".txt" ausgegeben (dadurch bleibt die Ausgangsdatei zunächst als Sicherung erhalten und muss nachträglich gelöscht werden).
Um das Script in einem Batch einzusetzen, ist es wie folgt aufzurufen (falls es zB als "C:\Scripts\Convert.vbs" gespeichert wurde):
Wurde das Script nicht erfolgreich beendet, wird ein Fehlercode (Errorlevel) 1 zurückgegeben (zB falls die Ausgangsdatei nicht übergeben oder gefunden wurde, oder bei Datenzeilen mit zu geringer Feldanzahl).
Grüße
bastla
Für die Teilaufgaben 1) bis 4) könntest Du folgendes (oberflächlich getestetes) VBScript verwenden:
Const FeldAnzahl = 40
If WScript.Arguments.Count < 1 Then
WScript.Quit(1)
End If
QuellDatei = WScript.Arguments(0)
ZielDatei = Left(QuellDatei, InstrRev(QuellDatei, ".") - 1) & ".txt"
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(QuellDatei) Then
WScript.Quit(1)
End If
Erg = ""
'Daten auslesen
Set Quelle = fso.OpenTextFile(QuellDatei, 1)
Do While Not Quelle.AtEndOfStream
Zeile = Quelle.ReadLine
If Trim(Zeile) <> "" Then
Z = Split(Zeile, ";", -1, 1)
Zeile2 = false
'Alle Felder gelesen?
If UBound(Z) < (FeldAnzahl - 1) Then
If Not Quelle.AtEndOfStream Then
Zeile = Quelle.ReadLine
Z2 = Split(Zeile, ";", -1, 1)
Zeile2 = True
'Korrekte Feldanzahl?
If (UBound(Z) + UBound(Z2)) <> (FeldAnzahl - 1) Then
WScript.Quit(1)
End If
Else
'Unvollständige Zeile
WScript.Quit(1)
End If
End If
'Feld 3 bei Bedarf ergänzen
If Z(2) = "''" Then Z(2) = "'-'"
'Ausgabezeile zusammensetzen und an bisherige Zeilen anfügen
Erg = Erg & Z(0)
For i = 1 To UBound(Z)
Erg = Erg & ";" & Z(i)
Next
If Zeile2 Then
Erg = Erg & Z2(0)
For i = 1 To UBound(Z2)
Erg = Erg & ";" & Z2(i)
Next
End If
'Ausgabezeile abschließen
Erg = Erg & vbCrLF
End If
Loop
Quelle.Close
'Keine Ausgabe vorhanden
If Erg = "" Then WScript.Quit(1)
'Ausgabedatei schreiben
Set Ziel = fso.OpenTextFile(ZielDatei, 2, True)
Ziel.Write Erg
Ziel.Close
Um das Script in einem Batch einzusetzen, ist es wie folgt aufzurufen (falls es zB als "C:\Scripts\Convert.vbs" gespeichert wurde):
cscript //nologo C:\Scripts\Convert.vbs "D:\Test\Ausgangsdatei.wts"
if errorlevel 1 goto :Fehler
Grüße
bastla
Hallo James2870!
Falls Deine Leerzeilen wirklich leer sind (ein Zeileninhalt, der ausschließlich Leerzeichen enthält, gilt ebenfalls als "leer"), sollte auch Schritt 4 erledigt werden - wird er jedenfalls bei meinen soeben durchgeführten Tests (mit den von Dir geposteten Datenzeilen, ohne Zeilennummer, ergänzt um weitere, per Zeilenschaltung erstellte Leerzeilen) ...
Vielleicht kannst Du die "Leerzeilen" etwas genauer darauf hin untersuchen, ob sie tatsächlich (außer ev Leerzeichen und Zeilenschaltungen - 0Ah und 0Dh) "nichts" enthalten. Ein mögliches Werkzeug dafür findest Du zB hier.
Grüße
bastla
Falls Deine Leerzeilen wirklich leer sind (ein Zeileninhalt, der ausschließlich Leerzeichen enthält, gilt ebenfalls als "leer"), sollte auch Schritt 4 erledigt werden - wird er jedenfalls bei meinen soeben durchgeführten Tests (mit den von Dir geposteten Datenzeilen, ohne Zeilennummer, ergänzt um weitere, per Zeilenschaltung erstellte Leerzeilen) ...
Vielleicht kannst Du die "Leerzeilen" etwas genauer darauf hin untersuchen, ob sie tatsächlich (außer ev Leerzeichen und Zeilenschaltungen - 0Ah und 0Dh) "nichts" enthalten. Ein mögliches Werkzeug dafür findest Du zB hier.
Grüße
bastla
Hallo James2870!
Die schlechte Nachricht ist eine gute Nachricht
: Auch mit den neuen Beispielsdaten klappt's bei mir - Vorschlag daher: Versuch einmal selbst, die Testdaten aus dem Posting zurück in eine Textdatei zu kopieren und zu konvertieren - würde mich interessieren, welches Ergebnis Du erzielst.
Außerdem ist es sicher sinnvoll, mir "Originaldaten" zukommen zu lassen - Mailadresse hast Du als PN.
Grüße
bastla
Die schlechte Nachricht ist eine gute Nachricht
Außerdem ist es sicher sinnvoll, mir "Originaldaten" zukommen zu lassen - Mailadresse hast Du als PN.
Grüße
bastla