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

Mitglied: kami202

kami202 (Level 1) - Jetzt verbinden

03.03.2009, aktualisiert 12:24 Uhr, 5073 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

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 23 StundenWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 1 TagAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Hyper-V
Hyper-V mit altem XEON-Server. Was ist falsch?
Frage von LollipopHyper-V11 Kommentare

Hallo Bin etwas frustriert. Kleinbetrieb, ca. 15 PC's, 2 Stk. Server mit einigen virtuellen PC's für Fernwartung, VaultServer für ...

Windows Netzwerk
Backup über WAN
Frage von petereWindows Netzwerk11 Kommentare

Hallo, ich muss aus einem entfernten WAN (synchrone 1Gbit) Daten sichern. Dabei handelt es sich sowohl um wenige große ...