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

CSV per Batch umschreiben

Frage Entwicklung Batch & Shell

Mitglied: kami202

kami202 (Level 1) - Jetzt verbinden

03.03.2009, aktualisiert 12:24 Uhr, 4977 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Dateinamen umschreiben batch (5)

Frage von jocheng zum Thema Batch & Shell ...

Batch & Shell
gelöst 1 PDF duplizieren und umbenennen nach CSV mittels Batch (5)

Frage von Kalisser zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...