leknilk0815
Goto Top

CSV- Trennzeichen per Batch ändern für deutsches Excel

Servus,
ich bastle nun schon länger an einer Möglichkeit rum, die Delims in einer CSV- Datei (Wetterdaten) vom englischen Standard (Delims="," Dezimaltrennung=".") auf deutsch (Delims=";" Dezimaltrennung=",") umzubauen.
Leider gelingts mir nicht...
Die CSV sieht so aus (hier nur die erste Zeile (=Überschrift) und die ersten beiden Datenzeilen (können hunderte sein):
,,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,38
30.12.2009,21:05,16.1,5.6,5.3,3.9,3.1,3,-20.6,42.3,4,4.7,0,0,0,0,0,0,52,86,83,0,0,0,0,0,0,90,0,0,0,0,0,0,918,0,.5,0,0
22.04.2014,09:27,17.5,10.5,22.8,4.5,8.8,100,58.5,42.6,9.3,14.3,0,0,0,0,0,0,52,82,99,0,0,0,0,0,0,75,0,0,0,0,0,0,932,0,0,0,0
Es müssten also zuerst alle Kommas durch Semicolon ausgetauscht werden.
Dann müssten die Dezimaltrenner (".") durch Kommas getauscht werden, allerdings ohne dies beim Datum (Token 1) zu machen, da müssten die Punkte bleiben.
Ich habe versucht, zwei Dateien zu generieren, eine mit dem Datum und eine mit dem Rest, wobei ich beim "Rest" schon kläglich scheitere, weil ich keine Ahnung habe, wie man der Batch sagt, daß sie Token 2-38 "auslagern" soll, ohne daß man ""tokens=3,4,5,6,7,8,9,10...." schreibt...
For /F "tokens=1 delims=," %%i in (probe.txt) do echo %%i  %%j >>probe-teil1.txt  
For /F "tokens=2,3,4 delims=," %%i in (probe.txt) do echo %%i  %%j  %%k >>probe-teil2.txt  
...von Problemen wie dem, daß am Ende auch die Überschriftszeile wieder vorhanden sein muss, ganz zu schweigen...
Ein Beispiel, wie das zu bewerkstelligen ist, wäre natürlich genial...

Danke vorab!

Gruß - Toni

Content-ID: 255528

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

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

vossi31
vossi31 21.11.2014 aktualisiert um 13:52:22 Uhr
Goto Top
Moin,

was willst Du denn erreichen? Per Doppelklick die CSV-Datei mit Excel öffnen?

Wenn es keine Aktion ist, die immer wieder vorkommt kannst Du doch ganz einfach über Öffnen in Excel den Textkonvertierungsassistenten benutzen und alles einfach einstellen. Wenn Du es immer wieder benötigt gibts es noch freie Kommandozeilen-Tools wie z.B. CSV2XLS um so etwas hinzubekommen.

Henning
colinardo
colinardo 21.11.2014 aktualisiert um 21:15:40 Uhr
Goto Top
Hallo Toni,
hatten wir hier schon einige male, für den direkten Import in Excel:
Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen - Datumsformat weg??

oder verabschiede dich mal von Batch und mach das mit Powershell face-wink:
(Import-csv 'C:\test.csv' -Delimiter "," | ConvertTo-Csv -NoTypeInformation -Delimiter ";") -replace '("-?\d+)\.(\d+")','$1,$2' | out-file 'C:\test_out.csv'  
Grüße Uwe
leknilk0815
leknilk0815 21.11.2014 um 16:43:31 Uhr
Goto Top
Zitat von @colinardo:
oder verabschiede dich mal von Batch und mach das mit Powershell face-wink:

Servus Uwe,
danke mal, Powershell kannte ich noch nicht, habs aber mal probiert - mit mäßigem Ergebnis, mit dem ich alleine auch nicht weiterkomme, da ich der Syntax und damit der Fehlermeldung etwas hilflos gegenüberstehe...
Daher wollte ich auch mit Batch arbeiten, weil ich das zwar auch nicht gerade im Schlaf beherrsche, aber zumindest in der Lage bin, einen vorgefertigten Code auf meine Bedürfnisse anzupassen (damit meine ich nicht nur Pfadangaben...)
Wenn sich jemand "erbarmen" würde, mir da etwas zu schnipseln, wäre ich sehr dankbar.
@Henning
mit Excel hat das nichts zu tun, da kann ich mir selber helfen. Man könnte die Anpassung natürlich "schnell mal" auch mit Notepad oder/und Excel machen, aber wenn man das häufiger macht ist eine Batch (deren Arbeitsweise man versteht!) weit komfortabler.
Dafür jedoch ein Tool unbekannter Herkunft auf die Kiste zu packen ist eher ungut, zumal man eine Batch schnell mal an einen Wetterkollegen weitergeben kann, ein fremdes Tool würde die Sache unnötig komplizieren und wer weiß schon, was die kostenlosen Dinger sonst noch so treiben...
Aber trortzdem Dank für Deine Mühe!

Gruß - Toni

Hier noch das "Ergebnis" von Powershell:
PS C:\> (Import-csv 'C:\@tmp\@csv-konvertierung\powershell\WetterAktuell.csv' -Delimiter "," | ConvertTo-Csv -NoTypeInformation -Delimiter ";" -Encoding UTF8) -  
replace '("\d+)\.(\d+")','$1,$2' | out-file 'C:\@tmp\@csv-konvertierung\powershell\test_out.csv'  
---------------------------------------------------------------
ConvertTo-Csv : Es wurde kein Parameter gefunden, der dem Parameternamen "Encoding" entspricht.  
Bei Zeile:1 Zeichen:145
+ (Import-csv 'C:\@tmp\@csv-konvertierung\powershell\WetterAktuell.csv' -Delimiter "," | ConvertTo-Csv -NoTypeInformation -Delimiter ";" -Encoding <<<<  UTF8)  
 -replace '("\d+)\.(\d+")','$1,$2' | out-file 'C:\@tmp\@csv-konvertierung\powershell\test_out.csv'  
    + CategoryInfo          : InvalidArgument: (:) [ConvertTo-Csv], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ConvertToCsvCommand
colinardo
colinardo 21.11.2014 aktualisiert um 17:51:15 Uhr
Goto Top
Hier noch das "Ergebnis" von Powershell:
Sorry,war nur ein Parameter zu viel, ist oben geändert face-wink
114757
Lösung 114757 21.11.2014, aktualisiert am 22.11.2014 um 12:20:36 Uhr
Goto Top
und in Batch etwa so:
(Für deinen Fall in dem in der Überschriftenzeile die ersten beiden Spaltennamen fehlen, angepasst)
@echo off & setlocal ENABLEDELAYEDEXPANSION
set "eingabe=C:\daten.csv"  
set "ausgabe=C:\daten_out.csv"  
set header=
for /f "usebackq tokens=1,* delims=," %%a in ("%eingabe%") DO @(  
  set rest=%%b
  set rest=!rest:,=;!
  if not defined header (
        set header=Datum;Zeit;%%a;!rest!
	echo !header!>"%ausgabe%"  
  ) else (
 	set rest=!rest:.=,!
  	echo %%a;!rest!>>"%ausgabe%"  
  )
)
Gruß jodel32

edit noch was korrigiert.
leknilk0815
leknilk0815 21.11.2014 aktualisiert um 20:52:17 Uhr
Goto Top
Zitat von @colinardo:
Sorry,war nur ein Parameter zu viel, ist oben geändert face-wink
Danke für die Korrektur
...nun kommt die Meldung in abgeänderter Form...

Import-Csv : Das Element "0" ist bereits vorhanden.  
Bei Zeile:1 Zeichen:12
+ (Import-csv <<<<  'C:\@tmp\@csv-konvertierung\powershell\WetterAktuell.csv' -  
Delimiter "," | ConvertTo-Csv -NoTypeInformation -Delimiter ";") -replace '("\d  
+)\.(\d+")','$1,$2' | out-file 'C:\@tmp\@csv-konvertierung\powershell\test_out.  
csv'  
    + CategoryInfo          : NotSpecified: (:) [Import-Csv], ExtendedTypeSyst
   emException
    + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,
   Microsoft.PowerShell.Commands.ImportCsvCommand
colinardo
Lösung colinardo 21.11.2014, aktualisiert am 22.11.2014 um 12:20:25 Uhr
Goto Top
Zitat von @leknilk0815:
Danke für die Korrektur
...nun kommt die Meldung in abgeänderter Form...
Öhm was verwendest du hier für Pfadnamen mit einem @ am Anfang ??

-Edit-
Hmm, dein Eingabefile scheint in der Überschriftenzeile komisch zu sein (eventuell doppelte Überschriften für zwei Spalten ? läuft hier mit deinem Demodaten von oben einwandfrei !
Warum sind die ersten beiden Spalten deiner Überschriftenzeile leer ? Oder du hast den Code nicht korrekt kopiert überprüfe ihn nochmal.
Bei ganz harten Fällen geht's auch so:
((gc 'c:\Daten.csv' | %{'"' + $_ + '"'}) -replace ',','";"') -replace '("-?\d*)\.(\d+")','$1,$2' | out-file 'C:\Daten_out.csv'
oder so
gc 'c:\Daten.csv' | %{$line = $_.Replace(',',';').Split(';',2); ($line + ';' + $line[1].Replace('.',','))} | out-file 'C:\Daten_out.csv'
leknilk0815
leknilk0815 22.11.2014 um 09:33:45 Uhr
Goto Top
@114757:
Servus und danke für die Arbeit, die Batch funktioniert (fast) wie gewünscht.
Einziges Manko: in der ersten Zeile der Quelldatei (=Spaltenbeschreibung) sind am Anfang zwei ",,", die ebenfalls in ";;" umgewandelt werden sollen.
Die Batch macht daraus leider (in Worten!): "Datum;Zeit;" - der Rest passt.
Kann man das vielleicht noch ändern?

Gruß - Toni
leknilk0815
leknilk0815 22.11.2014 um 09:34:48 Uhr
Goto Top
@colinardo:
vielen Dank auch Dir, die letzte Version funktioniert mit allen Schikanen.
Leider gibts aber noch viele Leute, die als Wetterrechner WIN XP laufen haben.
Da die Powershell erst ab Win7 verfügbar ist, werde ich wohl lieber die Batch von jodel32 bevorzugen (sofern das mit den beiden ersten Spaltenüberschriften in den Griff zu bekommen ist), weils mit Batch halt keine "Kompatibilitätsprobleme" giben würde.
<quote>Öhm was verwendest du hier für Pfadnamen mit einem @ am Anfang ??</quote>
das "@" am Anfang verwende ich, weil in der Listung vom Explorer ein "@" das Verzeichnis ganz oben aufhängt. Ist bei Tests übersichtlicher...
colinardo
colinardo 22.11.2014 um 11:56:04 Uhr
Goto Top
Da die Powershell erst ab Win7 verfügbar ist
Die lässt sich problemlos auch in XP nachrüsten face-smile
http://support.microsoft.com/kb/968929/de-de
114757
114757 22.11.2014 aktualisiert um 12:02:40 Uhr
Goto Top
Zitat von @leknilk0815:

@114757:
Servus und danke für die Arbeit, die Batch funktioniert (fast) wie gewünscht.
Einziges Manko: in der ersten Zeile der Quelldatei (=Spaltenbeschreibung) sind am Anfang zwei ",,", die ebenfalls in
";;" umgewandelt werden sollen.
Die Batch macht daraus leider (in Worten!): "Datum;Zeit;" - der Rest passt.
Kann man das vielleicht noch ändern?

Gruß - Toni
Na den Code einmal durchzulesen, kann man eigentlich schon erwarten, dann weißt du wo du was ändern musst, dafür sollten rudimentäre Batchkenntnisse ausreichen. Tipp: Siehe Zeile 9 !
Das schafft sogar mein Sohneman face-wink

Gruß jodel32
leknilk0815
leknilk0815 22.11.2014 um 12:15:22 Uhr
Goto Top
Zitat von @114757:
Tipp: Siehe Zeile 9 !
Das schafft sogar mein Sohneman face-wink
Danke, läuft.
leknilk0815
leknilk0815 22.11.2014 um 12:19:44 Uhr
Goto Top
Servus,
daß man das "nachrüsten" kann, war schon klar, aber genau das soll ja vermieden werden.
Bei einer Batch ist es praktisch egal, welches MS- OS läuft, die geht überall. Daher brauchts keine Erklärungen, was man alles erst erledigen muss, bevor man eine CSV konvertieren kann.
So - Thema erledigt, ich bin voll zufrieden und hab wieder was gelernt.

Danke an euch beide und Gruß - Toni
114757
114757 22.11.2014 aktualisiert um 12:29:14 Uhr
Goto Top
Die paar XPler sterben auch bald aus ... Zur Info: Batch ist in den nächsten 3,4 Jahren in neueren Windows OS abgekündigt ! Habe ich auf einer MS Konferenz mitbekommen, Powershell wird sie ablösen, also rechtzeitig mal was Neues lernen face-wink sonst verpasste den Anschluss.