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

CSV per Batch umschreiben

Frage Entwicklung Batch & Shell

Mitglied: kami202

kami202 (Level 1) - Jetzt verbinden

03.03.2009, aktualisiert 12:24 Uhr, 5061 Aufrufe, 8 Kommentare

Hallo,
kann mir ev. jemand bei folgendem Problem helfen?

ich habe in einem Ordner mehrere *.csv. Ganz normal mit ; getrennt. Jede Datei beginnt mit 2 Zeilen, die ich ignorieren muss.
Hier ein paar Beispielzeilen:

Zeile1 (nicht verändern, aber "mitnehmen")
Zeile2 (nicht verändern, aber "mitnehmen")
24779;00;120000;9401812;;0203;275003;130;;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;

In jeder vorhandenen *.csv soll ab der dritten Zeile für jede Zeile folgendes gemacht werden:
- Suche im 12.Feld (das mit irgendwelcher Text + Leerzeichen + 6stellige Zahl) die letzten 6 Zeichen. Wenn das 6 Zahlen sind schreibe diese in das 9. Feld derselben Zeile, sonst lass es.
- Speichere das Ergebnis unter demselben Dateinamen.

Das Ergebnis müsste also dann so aussehen:

Zeile1
Zeile2
24779;00;120000;9401812;;0203;275003;130;091424;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;

Das Ganze soll unter WinXP funktionieren, wenn es mit Bordmitteln nicht geht kann ich auch SED oder ähnliches installieren.
ich glaube dafür reicht mein Shell-Wissen nicht mehr aus...
Hat jemand eine Idee?
Danke schonmal.
Mitglied: bastla
03.03.2009 um 21:20 Uhr
Hallo kami202 und willkommen im Forum!

Mit Batch alleine wäre es etwas mühsam, daher bietet es sich an, etwas Unterstützung durch ein integriertes VBScript zu verwenden:
01.
@echo off & setlocal 
02.
set "Basis=D:\CSV-Dateien\" 
03.
set "Maske=*.csv" 
04.
set "Trenn=;" 
05.
 
06.
set M=%temp%\ModifyCSV.vbs 
07.
> %M% echo Set fso=CreateObject("Scripting.FileSystemObject"):D=WScript.Arguments(0):T=Split(fso.OpenTextFile(D).ReadAll,vbCrLf) 
08.
>>%M% echo W=False:For i=2 To UBound(T):F=Split(T(i),"%Trenn%"):Z=Right(F(11),6):If Len(Z)=6 Then 
09.
>>%M% echo OK=1:For j=1 To 6:OK=OK*(Mid(Z,j,1)^>="0")*(Mid(Z,j,1)^<="9"):Next:If OK Then F(8)=Z:T(i)=Join(F,"%Trenn%"):W=True 
10.
>>%M% echo End If:Next:If W Then fso.CreateTextFile(D).Write Join(T, vbCrLf) 
11.
 
12.
for %%i in ("%Basis%%Maske%") do cscript //nologo %M% "%%i"
Bitte beachten: Bei der Angabe des Ordners, in welchem die CSV-Dateien liegen (Zeile 2), immer am Ende des Pfades einen "\" schreiben.

Die Informationen über die Anzahl der zu überspringenden Zeilen, die Feldnummern 12 und 9 sowie die Zeichenanzahl (6) am Ende des Feldes 12 sind im Script "hart codiert" (wobei die Zählung der Feldnummern bei 0 beginnt und daher die um 1 verminderten Werte angegeben werden müssen). Das Script ist übrigens nach dem ersten Durchlauf unter "%temp%\ModifyCSV.vbs" zu finden.

Da die Zeilen "in den Dateien" (ohne Sicherungskopie) verändert werden, bitte Vorsicht beim Testen!

Grüße
bastla
Bitte warten ..
Mitglied: kami202
04.03.2009 um 08:30 Uhr
Hallo und vielen Dank für die Mühe!
Soweit wie ich das verstehe sieht das genau nach dem aus, was ich suche. Leider klappts nicht:

ModifyCSV.vbs(2, 48) Laufzeitfehler in Microsoft VBScript: Index außerhalb des gültigen Bereichs: '[number: 11]'

Irgendwas mit dem Split scheint nicht zu klappen, aber ich blicks nicht.

Schöne Grüße,
kami202
Bitte warten ..
Mitglied: bastla
04.03.2009 um 09:26 Uhr
Hallo kami202!

Die Fehlermeldung weist darauf hin, dass kein Feld 12 gefunden wurde (was etwa am Trennzeichen oder an einer Leerzeile liegen könnte) - sieh Dir bitte die Daten an (und, soferne möglich) poste die entsprechenden Zeilen unter Verwendung der Code-Formatierung.

Grüße
bastla

P.S.: Mit Deinen oben dargestellten Testdaten funktioniert der Batch bei mir ...
Bitte warten ..
Mitglied: kami202
04.03.2009 um 12:17 Uhr
Hallo,

superschnelle Anwort, danke.
Also ich habe ebenfalls die 4 Beispielzeilen als irgendwas.csv gespeichert und das komplette Script von hier in eine irgendwas.bat gespeichert. Dann den Pfad angepasst (inkl. dem \\ ) und auf der Konsole aufgerufen.

Das hier ist exakt meine kleinste Testdatei:

01.
Zeile1 (nicht verändern, aber \"mitnehmen\") 
02.
Zeile2 (nicht verändern, aber \"mitnehmen\") 
03.
24779;00;120000;9401812;;0203;275003;130;;;;irgendwelcher Text 091424;;;EUR;;; 
04.
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;
und ich bekomme leider:

Path-to-Temp\\ModifyCSV.vbs(2, 48) Laufzeitfehler in Microsoft VBScript: Index außerhalb des gültigen Bereichs: \'[number: 11]\'

Die ersten beiden Zeilen werden ja übersprungen, die können es also nicht sein. Ich habe trotzdem auch Dateien mit mehr Zeilen genommen und da mal die beiden Header-Zeilen entfernt, selbes Ergebnis.
Die 12. Spalte ist aber definitiv da. Alle Zeilen haben genauso viele Spalten, wenn etwas leer ist, steht eben dann ;;; nebeneinander, also kein Problem eigentlich.
Ich teste auf XP Pro SP3.

Danke für deine Mühe,
kami202
Bitte warten ..
Mitglied: bastla
04.03.2009 um 12:38 Uhr
Hallo kami202!

Könntest Du bitte auch den Batch und die "Path-to-Temp\ModifyCSV.vbs" posten? Bei mir gibt's nämlich mit Daten und Batch (beide nochmals hier heruntergeladen) kein Problem ...

Grüße
bastla
Bitte warten ..
Mitglied: kami202
04.03.2009 um 13:41 Uhr
Hallo und danke für den tollen Support!!!
Ich habe das "Problem" gefunden:
Die CSVs, die ich verarbeiten muss, enden mit einem Enter. Also steht der Corsor ganz unten immer in einer leeren Zeile, die logischerweise keine Spalte 12 enthalten kann. Kann man die Zeile irgendwie ignorieren lassen?

kami202
Bitte warten ..
Mitglied: bastla
04.03.2009 um 13:50 Uhr
Hallo kami202!

Um sich nicht darauf verlassen zu müssen, dass die letzte Zeile ignoriert werden kann/soll/muss prüft das Script jetzt auf Leerzeilen:
01.
@echo off & setlocal 
02.
set "Basis=D:\CSV-Dateien\" 
03.
set "Maske=*.csv" 
04.
set "Trenn=;" 
05.
 
06.
set M=%temp%\ModifyCSV.vbs 
07.
> %M% echo Set fso=CreateObject("Scripting.FileSystemObject"):D=WScript.Arguments(0):T=Split(fso.OpenTextFile(D).ReadAll,vbCrLf) 
08.
>>%M% echo W=False:For i=2 To UBound(T):If T(i)^<^>"" Then 
09.
>>%M% echo F=Split(T(i),"%Trenn%"):Z=Right(F(11),6):If Len(Z)=6 Then 
10.
>>%M% echo OK=1:For j=1 To 6:OK=OK*(Mid(Z,j,1)^>="0")*(Mid(Z,j,1)^<="9"):Next:If OK Then F(8)=Z:T(i)=Join(F,"%Trenn%"):W=True 
11.
>>%M% echo End If 
12.
>>%M% echo End If:Next:If W Then fso.CreateTextFile(D).Write Join(T, vbCrLf) 
13.
 
14.
for %%i in ("%Basis%%Maske%") do cscript //nologo %M% "%%i"
Grüße
bastla
Bitte warten ..
Mitglied: kami202
04.03.2009 um 14:00 Uhr
Tausend dank, klappt hervorragend.
Du bist der Oberheld der VBS und Batch-Programmierung. Hat mir wirklich weitergeholfen. Danke!
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Dateinamen umschreiben batch
gelöst Frage von jochengBatch & Shell5 Kommentare

Hi Leute ich trete mal wieder auf der Stelle. Es geht darum Bilddaten umzuschreiben. Ich bin auch fast am ...

Batch & Shell
CSV kleinerer Wert (Batch)
Frage von jochengBatch & Shell3 Kommentare

Ich habe eine CSV Datei mit folgendem Inhalt: 29664;24,95 29664;12,95 29645;9,95 29645;9,95 29655;12,95 29655;24,95 29664;24,95 29655,12,95 29655,24,95 29664;12,95 29664;24,95 ...

Batch & Shell
Batch zum bearbeiten mehrerer CSV
Frage von Matzus87Batch & Shell3 Kommentare

Hallo Zusammen, ich bin neu hier und arbeite mich gerade in die Batch Programmierung ein. Ich sitze momentan an ...

Windows Tools
Batch script in Powershell umschreiben um Kennwortverschlüsselung gewährleisten zu können
gelöst Frage von JGS2015Windows Tools5 Kommentare

Edit: Sorry hatte den letzten Post zu schnell rein gepresst. Moin zusammen, Es geht um folgendes Skript: :repeat echo ...

Neue Wissensbeiträge
Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 3 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 4 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 16 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Verschlüsselung & Zertifikate

19 Jahre alter Angriff auf TLS funktioniert immer noch

Information von BassFishFox vor 22 StundenVerschlüsselung & Zertifikate1 Kommentar

Interessant zu lesen. Der Bleichenbacher-Angriff gilt unter Kryptographen als Klassiker, trotzdem funktioniert er oft noch. Wie wir herausgefunden haben, ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
NAS über zwei weitere Ethernet Anschlüsse verbinden
gelöst Frage von Sibelius001Netzwerkmanagement17 Kommentare

Sorry - ich bin hier wahrscheinlich als kompetter IT Trottel unterwegs. Aber eventuell kann mir jemand ganz einfach helfen: ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...