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

Manipulation .txt mittels Batch-Script

Frage Entwicklung Batch & Shell

Mitglied: James2870

James2870 (Level 1) - Jetzt verbinden

05.03.2007, aktualisiert 13.03.2007, 5248 Aufrufe, 6 Kommentare

[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:

01.
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' 
02.
2: 
03.
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' 
04.
4: 
05.
 
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:
01.
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  
02.
2:besser kurz vor Lieferung anrufen';'';'10';'';'';'';'03.01.1942' 
03.
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
Mitglied: bastla
05.03.2007 um 20:31 Uhr
Hallo James2870!

Für die Teilaufgaben 1) bis 4) könntest Du folgendes (oberflächlich getestetes) VBScript verwenden:
01.
Const FeldAnzahl = 40 
02.
If WScript.Arguments.Count < 1 Then 
03.
	WScript.Quit(1) 
04.
End If 
05.
 
06.
QuellDatei = WScript.Arguments(0) 
07.
ZielDatei = Left(QuellDatei, InstrRev(QuellDatei, ".") - 1) & ".txt" 
08.
Set fso = Wscript.CreateObject("Scripting.FileSystemObject") 
09.
 
10.
If Not fso.FileExists(QuellDatei) Then 
11.
	WScript.Quit(1) 
12.
End If 
13.
 
14.
Erg = "" 
15.
'Daten auslesen 
16.
Set Quelle = fso.OpenTextFile(QuellDatei, 1) 
17.
Do While Not Quelle.AtEndOfStream 
18.
	Zeile = Quelle.ReadLine 
19.
	If Trim(Zeile) <> "" Then 
20.
		Z = Split(Zeile, ";", -1, 1) 
21.
		Zeile2 = false 
22.
		'Alle Felder gelesen? 
23.
		If UBound(Z) < (FeldAnzahl - 1) Then 
24.
			If Not Quelle.AtEndOfStream Then 
25.
				Zeile = Quelle.ReadLine 
26.
				Z2 = Split(Zeile, ";", -1, 1) 
27.
				Zeile2 = True 
28.
				'Korrekte Feldanzahl? 
29.
				If (UBound(Z) + UBound(Z2)) <> (FeldAnzahl - 1) Then  
30.
					WScript.Quit(1) 
31.
				End If 
32.
			Else 
33.
				'Unvollständige Zeile 
34.
				WScript.Quit(1) 
35.
			End If 
36.
		End If 
37.
		'Feld 3 bei Bedarf ergänzen 
38.
		If Z(2) = "''" Then Z(2) = "'-'" 
39.
		'Ausgabezeile zusammensetzen und an bisherige Zeilen anfügen 
40.
		Erg = Erg & Z(0) 
41.
		For i = 1 To UBound(Z) 
42.
			Erg = Erg & ";" & Z(i) 
43.
		Next 
44.
		If Zeile2 Then 
45.
			Erg = Erg & Z2(0) 
46.
			For i = 1 To UBound(Z2) 
47.
				Erg = Erg & ";" & Z2(i) 
48.
			Next 
49.
		End If 
50.
		'Ausgabezeile abschließen 
51.
		Erg = Erg & vbCrLF 
52.
	End If 
53.
Loop 
54.
Quelle.Close 
55.
 
56.
'Keine Ausgabe vorhanden 
57.
If Erg = "" Then WScript.Quit(1) 
58.
 
59.
'Ausgabedatei schreiben 
60.
Set Ziel = fso.OpenTextFile(ZielDatei, 2, True) 
61.
Ziel.Write Erg 
62.
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):
01.
cscript //nologo C:\Scripts\Convert.vbs "D:\Test\Ausgangsdatei.wts" 
02.
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
Bitte warten ..
Mitglied: James2870
06.03.2007 um 11:04 Uhr
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
Bitte warten ..
Mitglied: bastla
06.03.2007 um 11:52 Uhr
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
Bitte warten ..
Mitglied: James2870
06.03.2007 um 12:34 Uhr
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:

01.
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:

01.
CMDOW @ /HID 
02.
setlocal enabledelayedexpansion 
03.
FOR %%i in (C:\scripts\test\data\*.*) do call :loop "%%i" 
04.
exit 
05.
 
06.
:loop 
07.
set part1=%1 
08.
set part2=%part1:~1,-1% 
09.
cscript //nologo C:\scripts\test\Convert.vbs %part2% 
10.
if errorlevel 1 goto :Fehler 
11.
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
Bitte warten ..
Mitglied: bastla
06.03.2007 um 13:10 Uhr
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
Bitte warten ..
Mitglied: James2870
13.03.2007 um 15:30 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch Script Editor - Programmvorstellung des Entwicklers (16)

Tipp von wowItsDoge zum Thema Batch & Shell ...

Windows Server
Batch Script bei Start ausführen (3)

Frage von KEFHVDI zum Thema Windows Server ...

Batch & Shell
Batch-Script für Lizenzen (3)

Frage von stoepsu77 zum Thema Batch & Shell ...

Batch & Shell
Batch-Script für die Messung der Netzwerkgeschwindigkeit (10)

Anleitung von Kraemer zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...