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-Datei Spalten per Batch auf 0 setzen

Frage Entwicklung Batch & Shell

Mitglied: elfatalelegre

elfatalelegre (Level 1) - Jetzt verbinden

19.03.2009, aktualisiert 18.10.2012, 6407 Aufrufe, 11 Kommentare

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
Mitglied: 76109
19.03.2009 um 19:51 Uhr
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
Bitte warten ..
Mitglied: elfatalelegre
19.03.2009 um 20:01 Uhr
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
Bitte warten ..
Mitglied: 76109
19.03.2009 um 20:27 Uhr
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 ";;;"
Bitte warten ..
Mitglied: Biber
19.03.2009, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: elfatalelegre
20.03.2009 um 08:32 Uhr
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
Bitte warten ..
Mitglied: 76109
20.03.2009 um 12:03 Uhr
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.

01.
Dateiname = ConvertCvs.Vbs
01.
Option Explicit 
02.
 
03.
Dim Fso, cPath, cFolder, cFile, cName, cFound, sFolder, sFile, i, s 
04.
 
05.
Set Fso = CreateObject("Scripting.FileSystemObject")  
06.
 
07.
cPath = InputBox("Bitte Pfad mit den Csv-Dateien eingeben.", _ 
08.
                 "Csv-Dateien konvertieren") 
09.
 
10.
If cPath = "" Then Wscript.Quit 
11.
     
12.
Set cFolder = Fso.GetFolder(Fso.GetAbsolutePathName(cPath)) 
13.
 
14.
sFolder = cFolder.Path & "\export" 
15.
 
16.
If Not Fso.FolderExists(sFolder) Then Call Fso.CreateFolder(sFolder) 
17.
 
18.
For Each cFound In cFolder.Files 
19.
  If LCase(Fso.GetExtensionName(cFound.Name)) = "csv" Then 
20.
    i = i + 1 
21.
    Set cFile = Fso.OpenTextFile(cFound.Path) 
22.
    Set sFile = Fso.CreateTextFile(sFolder & "\" & cFound.Name) 
23.
    Do Until cFile.AtEndOfStream 
24.
      s = Split(cFile.ReadLine, ";") 
25.
      If UBound(s) >= 10 Then _ 
26.
         s(1) = 0:  s(10) = "SSH":  sFile.WriteLine Join(s, ";") 
27.
    Loop 
28.
    cFile.Close 
29.
    sFile.Close 
30.
  End If 
31.
Next 
32.
 
33.
MsgBox "Es wurden " & i & " Csv-Dateien gefunden und konvertiert.", , "Hinweis" 
34.
 
35.
Wscript.Quit
Gruß Dieter
Bitte warten ..
Mitglied: lemmi222
20.03.2009 um 12:12 Uhr
Statt vb oder CMD-Batch würde ich für diesen Zweck awk empfehlen. awk gibt es für praktisch jedes Betriebssystem.
Bitte warten ..
Mitglied: 76109
20.03.2009 um 12:22 Uhr
Hallo lemmi222,

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


Gruß Dieter
Bitte warten ..
Mitglied: elfatalelegre
20.03.2009 um 13:45 Uhr
Hallo zusammen, das hat prima geklappt

Vielen Dank!
Bitte warten ..
Mitglied: lemmi222
20.03.2009 um 13:57 Uhr
hat sich zwar erledigt, aber einfach mal so

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


Gruß

Lemmi
Bitte warten ..
Mitglied: 76109
20.03.2009 um 14:40 Uhr
Hallo Gregor,

freut mich das es geklappt hat.


Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

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 ...