james2870
Goto Top

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:

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 11face-smile, 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:
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:
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

Content-Key: 53194

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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: bastla
bastla 05.03.2007 um 20:31:15 Uhr
Goto Top
Hallo James2870!

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
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):
cscript //nologo C:\Scripts\Convert.vbs "D:\Test\Ausgangsdatei.wts"  
if errorlevel 1 goto :Fehler
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
Mitglied: James2870
James2870 06.03.2007 um 11:04:25 Uhr
Goto Top
Hallo bastla!

Also zuerst einmal vielen vielen Dank für Deine Bemühungen ... das finde ich echt super!!!!!

Das Script funktioniert auch wunderbar, was Schritt 1) bis 3) betrifft.
Das Einzige, was noch nicht passiert, ist, dass die Leerzeilen zwischen den Datenzeilen gelöscht werden.
Vielleicht gibt es da noch eine Lösung ...

Aber, wie gesagt: der Rest funktioniert super! Danke nochmals

lg James
Mitglied: bastla
bastla 06.03.2007 um 11:52:21 Uhr
Goto Top
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
Mitglied: James2870
James2870 06.03.2007 um 12:34:27 Uhr
Goto Top
Also in den meisten Fällen werden die Leerzeilen auch entfernt - nur manchmal bleiben sie bestehen - obwohl keine weiteren Zeichen ausser ein "Enter" in der Zeile stehen (zumindest werden mit dem Editor "PSPad" keine weiteren zeichen angezeigt, im HEX-Modus auch nichts anderes als "0A" und "0D") ...

Hier zB ein Datensatz, mit dem es nicht funktionert:

12007030125-1;'Tomberg';'.';'';'Wienerstrasse 3';'2500';'Schwimmen bei Köln';'0664/32334';'0636/44449';'Kinyberg';'.';'';'Wienerstrasse 3';'2500';'Schwimmen bei Köln';'0664/32334';'0636/44449';'30';'01';'';'';'00';'';'07';'';'0';'';'';'2';'1.0';'156.00';'';'';'bitte 1 1/2 Std.vor Lieferung anrufen';'';'10';'';'';'';'02.02.1964'  

Ich rufe mit einem Script hintereinander immer mehrere Dateien gleichzeitig auf.
Bei manchen entfernt er die Leerzeilen, bei manchen nicht ...
Das Script sieht folgendermaßen aus:

CMDOW @ /HID
setlocal enabledelayedexpansion
FOR %%i in (C:\scripts\test\data\*.*) do call :loop "%%i"  
exit

:loop
set part1=%1
set part2=%part1:~1,-1%
cscript //nologo C:\scripts\test\Convert.vbs %part2%
if errorlevel 1 goto :Fehler
move %part2% C:\scripts\test\archiv

Vielleicht hilft das bei der Lösung.
Dürfte ich Dir im Ernstfall auch eine Testdatei per Mail zukommen lassen, mit der es nicht funktioniert?

Auf jeden Fall schon mal DANKE im Voraus.

lg James
Mitglied: bastla
bastla 06.03.2007 um 13:10:52 Uhr
Goto Top
Hallo James2870!

Die schlechte Nachricht ist eine gute Nachricht face-wink: 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
Mitglied: James2870
James2870 13.03.2007 um 15:30:51 Uhr
Goto Top
Hallo bastla!

Ich wollte mich nochmals für Deine Hilfe bedanken.
Das Skript läuft nämlich einwandfrei.
Das Löschen der Leerzeilen ist dank einer Adaptierung am Import-Modul nicht mehr notwendig.

Sorry übrigens auch für die verspätete Meldung - aber ich wurde von einem Meeting zum Anderen gejagt und bin nicht eher dazugekommen.

Also, wie gesagt: Vielen vielen Dank nochmals, Du hast mir sehr geholfen!!!

lg Wolfgang