Top-Themen

Aktuelle Themen (A bis Z)

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, 5295 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 ..
Ähnliche Inhalte
Batch & Shell
Letzte Zeile einer .txt in eine andere .txt ausschneiden per Batch
gelöst Frage von AlexIOTBatch & Shell4 Kommentare

Hallo zusammen, zu meinem obrigen Thema habe ich leider nur in Richtung löschen und nicht in Richtung ausschneiden etwas ...

Batch & Shell
Batch mit for txt auslesen?
gelöst Frage von Mohji32Batch & Shell4 Kommentare

Hallo, ich habe mir den "Grundkurs" zu for schleifen im Board angeschaut aber leider nicht das hin bekommen was ...

Batch & Shell
Mit Batch Zeilen aus TXT modifizieren
gelöst Frage von chef1568Batch & Shell4 Kommentare

Hallo zusammen, leider konnte ich mit den bisherigen Threads mein Problem bisher nicht lösen. Problemstellung: In einer Textdatei sind ...

Batch & Shell
Mit Batch .txt auslesen und benutzen
gelöst Frage von GhostJumperHDBatch & Shell8 Kommentare

Ich habe folgendes Problem Ich möchte das W-Lan überlasten und möchte danach die .bat zur .exe umwandeln. Ich möchte ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 3 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 4 StundenSicherheit

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1010 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
Frage von CenuzeNetzwerkgrundlagen10 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
Frage von Z3R0C0MM4N0THiN6Windows Server9 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...