elfatalelegre
Goto Top

CSV-Datei Spalten per Batch auf 0 setzen

Hallo zusammen,

Ich habe etwa 2500 CSV-Dateien in einem Ordner mit folgendem Aufbau:

Zeile 1: 10008368;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 2: 10008369;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 3: ....

Das Erzeugerprogramm hat die Daten leider falsch erzeugt, ich kann mir aber weiterhelfen wenn ich per Batchbefehl folgende Änderungen in allen Dateien vornehme:

1. die zweite Spalte soll den Wert 0 erhalten (statt hier wie im Beispiel die 8793)
2. die Spalte mit "KA" (variable Textwerte) soll den Wert "SSH" erhalten

Kann mir jemand weiterhelfen, wie man das angeht?

Danke im voraus!

Gruß
elfatalegre

Content-ID: 111872

Url: https://administrator.de/contentid/111872

Ausgedruckt am: 26.11.2024 um 06:11 Uhr

76109
76109 19.03.2009 um 19:51:54 Uhr
Goto Top
Hallo,

ist das eine einmalige Angelegenheit oder kommt das öfter vor?
Sind die zu ändernden Spalten 2 und 11, so wie in den Zeilen oben?
Ist der Dateipfad konstant. Wenn ja bitte angeben?

Gruß Dieter
elfatalelegre
elfatalelegre 19.03.2009 um 20:01:24 Uhr
Goto Top
Hallo,

das ist eine einmalige Sache, sobald der Programmanbieter seine Software geändert hat, brauche ich es nicht mehr. Aber derzeit landen täglich etwa 120 Dateien davon im Ordner...

Richtig, die zu ändernden Spalten sind die Spalten 2 und 11.

Der Dateipfad ist egal, könnte man für die Batchlauf nach c:\batch\ verschieben.

Gruß
Gregor
76109
76109 19.03.2009 um 20:27:13 Uhr
Goto Top
Hallo,

danke für die schnelle Antwort.

Du kannst auch den Originalpfad verwenden, weil ich die Exportdateien in einen Unterordner schreibe. Das macht es einfacher d.h. aus dem Original-Ordner lesen
und in den Unter-Ordner neu schreiben.

Gruß Dieter

PS. Gibt es Leerzeilen mit ";;;"
Biber
Biber 19.03.2009, aktualisiert am 18.10.2012 um 18:37:53 Uhr
Goto Top
Moin elfatalegre,

willkommen im Forum.
Wir hatten Varianten dieses Themas schon ein- oder zweimal hier durchdekliniert und eine (typische) Lösung findest Du z.B. in diesem Thread Steuerzeichen per vbs aus txt-Datei entfernen oder auch über eine Forumssuche nach "ReadAll".

Idee (auch bei vielen anderen Lösungen) war:
  • "nur" Batch ist erstens ein bisschen langsam
  • aber auch grundsätzlich ist es vom Algorithmus her ein bisschen langsam, zeilenweise vorzugehen und diese Zeile wiederum in Felder/Tokens zu zerbröseln, einzelne Werte zu ersetzen und danach wieder aus vielen Feldern eine Zeile und aus vielen Zeilen eine Textdatei und aus vielen Dateien eine Genausoviel-Dateien-Fast-Kopie zeilenweise zu schreiben...
  • außerdem erfordern die leeren Felder ";;;;;" zumindest im Batch eine Sonderlocke ... einfacher wäre es, wenn NULL-Felder mit "NULL" oder "" oder whatever kenntlich wären
  • deshalb -> WENN ES DIE DATENINHALTE ERLAUBEN: lieber die ganze Datei als einen Klumpen auf- und anfassen und in diesem Klumpen alle ";KA;" durch ";SSH;" mit ReplaceAll() ersetzen und alle ";8793;" durch ";0;".

---> wenn allerdings in der 2.Spalte (also die mit Beispielwert 8793) je Datei oder gar innerhalb einer Datei unterschiedliche Werte stehen, dann müssen wir eben die "Feldliste" auch als Liste behandeln - aber auch das geht mit VBS schneller.

Deshalb Klärungsfrage: Stehen in "Spalte2" je Datei (oder noch öfter) unterschiedliche Werte oder immer "8793"?

Grüße
Biber
elfatalelegre
elfatalelegre 20.03.2009 um 08:32:23 Uhr
Goto Top
Guten Morgen!

@Biber: grundsätzlich ändern sich je Zeile (theoretisch) jedesmal Spalte 2 und Spalte 11, es sind also keine konstanten Werte.

@Dieter: wie oben im Beispiel stehend gibt es Leerzellen, die Spalten 2 und 11 sind allerdings immer befüllt.

Gruß

Gregor
76109
76109 20.03.2009 um 12:03:14 Uhr
Goto Top
Hallo Gregor und Biber,

Biber hat recht. Mit 2500 Dateien kann das eine Weile dauern.
Da es aber kein Dauerzustand ist, reicht das wohl behelfsmäßig aus.

Getestet habe ich 10 Csv-Dateien a 65536 Zeilen.
Das sind ca. 50 MB und gedauert hat' es etwa 30 Sekunden.

Beim Starten des Scripts wird eine Eingabebox mit der Pfadabfrage angezeigt.
Es werden nur CSV-Dateien im angegeben Pfad eingelesen und bleiben auch
unverändert. Die konvertierten Dateien werden in den Sub-Ordner ...\Export
geschrieben. Und am Ende wird eine Meldung "Anzahl Dateien..." ausgegeben.

Dateiname = ConvertCvs.Vbs

Option Explicit

Dim Fso, cPath, cFolder, cFile, cName, cFound, sFolder, sFile, i, s

Set Fso = CreateObject("Scripting.FileSystemObject")   

cPath = InputBox("Bitte Pfad mit den Csv-Dateien eingeben.", _  
                 "Csv-Dateien konvertieren")  

If cPath = "" Then Wscript.Quit  
    
Set cFolder = Fso.GetFolder(Fso.GetAbsolutePathName(cPath))

sFolder = cFolder.Path & "\export"  

If Not Fso.FolderExists(sFolder) Then Call Fso.CreateFolder(sFolder)

For Each cFound In cFolder.Files
  If LCase(Fso.GetExtensionName(cFound.Name)) = "csv" Then  
    i = i + 1
    Set cFile = Fso.OpenTextFile(cFound.Path)
    Set sFile = Fso.CreateTextFile(sFolder & "\" & cFound.Name)  
    Do Until cFile.AtEndOfStream
      s = Split(cFile.ReadLine, ";")  
      If UBound(s) >= 10 Then _
         s(1) = 0:  s(10) = "SSH":  sFile.WriteLine Join(s, ";")  
    Loop
    cFile.Close
    sFile.Close
  End If
Next

MsgBox "Es wurden " & i & " Csv-Dateien gefunden und konvertiert.", , "Hinweis"  

Wscript.Quit

Gruß Dieter
lemmi222
lemmi222 20.03.2009 um 12:12:44 Uhr
Goto Top
Statt vb oder CMD-Batch würde ich für diesen Zweck awk empfehlen. awk gibt es für praktisch jedes Betriebssystem.
76109
76109 20.03.2009 um 12:22:55 Uhr
Goto Top
Hallo lemmi222,

face-smiledann schlage ich vor, Du schreibst ein awk-Code für Gregor.


Gruß Dieter
elfatalelegre
elfatalelegre 20.03.2009 um 13:45:40 Uhr
Goto Top
Hallo zusammen, das hat prima geklappt

Vielen Dank!
lemmi222
lemmi222 20.03.2009 um 13:57:30 Uhr
Goto Top
hat sich zwar erledigt, aber einfach mal so face-big-smile

type Dateiname | awk -F "," {'print $1'"text,"$3","$4 ...'} > neue Datei


Gruß

Lemmi
76109
76109 20.03.2009 um 14:40:52 Uhr
Goto Top
Hallo Gregor,

face-smile freut mich das es geklappt hat.


Gruß Dieter