36831
30.08.2007, aktualisiert am 18.10.2012 um 18:36:21 Uhr
19664
36
0
Converter von csv zu xls - Basierend auf CLI, automatisierbar
Moin,
ich suche ein Tool, das nach Möglichkeit komplett auf der Commandozeile basiert, unter Windows läuft und zwischendurch keine Benutzereingaben erfordert. Es sollte also komplett automatisierbar sein und im Optimalfall sogar noch eine Ordnerüberwachung bieten, um nicht in Zeitabständen nach Dateien in einem bestimmten Ordner suchen zu müssen. Ansonsten nach Möglichkeit eine Funktion um (manuell angestoßen) alle CSV-Dateien in einem Ordner in xls (in einem anderen Ordner) umzuwandeln.
Was es können muss:
Konvertierung von CSV (Semikolon-getrennt, nächster Datensatz nach ENTER) in xls
Wer kennt ein entsprechendes Tool?
Wer hat Erfahrungen?
Weitere Fragen?
MfG,
VW
ich suche ein Tool, das nach Möglichkeit komplett auf der Commandozeile basiert, unter Windows läuft und zwischendurch keine Benutzereingaben erfordert. Es sollte also komplett automatisierbar sein und im Optimalfall sogar noch eine Ordnerüberwachung bieten, um nicht in Zeitabständen nach Dateien in einem bestimmten Ordner suchen zu müssen. Ansonsten nach Möglichkeit eine Funktion um (manuell angestoßen) alle CSV-Dateien in einem Ordner in xls (in einem anderen Ordner) umzuwandeln.
Was es können muss:
Konvertierung von CSV (Semikolon-getrennt, nächster Datensatz nach ENTER) in xls
Wer kennt ein entsprechendes Tool?
Wer hat Erfahrungen?
Weitere Fragen?
MfG,
VW
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 67477
Url: https://administrator.de/forum/converter-von-csv-zu-xls-basierend-auf-cli-automatisierbar-67477.html
Ausgedruckt am: 23.12.2024 um 14:12 Uhr
36 Kommentare
Neuester Kommentar
Hallo "Kürzester-bekannter-Nick"-Inhaber !
Ein Tool kenne ich nicht, aber als Bastellösung für das reine Umwandeln CSV in XLS könntest Du es mit dem folgenden VBScript (ein installiertes Excel vorausgesetzt) versuchen:
Abgesehen von etwas Errorhandling (ganz wasserdicht bekommt man/frau sowas ja ohnehin kaum) macht das Script eigentlich nix anderes, als Du von Hand in Excel machen würdest:
- CSV-Datei importieren (nicht "öffnen" - dazu unten mehr),
- ein ganz klein wenig formatieren (Spaltenbreiten anpassen) und
- als XLS-Datei speichern (da "ohne Benutzereingabe" gewünscht war, wird eine ev bestehende Zieldatei kommentarlos überschrieben).
Zur Verwendung: Das Script erwartet beim Aufruf die Übergabe zumindest einer Importdatei (auch per Drag&Drop oder "SendTo" möglich) mit passendem Inhalt, aber nicht zwingend einem Dateityp ".csv". Zusätzlich kann auch der Zielordner angegeben werden. Wird darauf verzichtet, wird der in Zeile 2 festgelegt Default-Zielpfad verwendet. Sollte der Zielpfad noch nicht existieren, wird versucht, diesen zu erstellen.
Das Script endet mit einem Errorlevel 1, wenn:
- keine Importdatei übergeben wird,
- die Importdatei nicht gefunden wird,
- der Zielordner nicht existiert und auch nicht erstellt werden kann,
- beim Schreiben der XLS-Datei ein Fehler auftritt.
In anderen Fällen (auch, um bei den Tests Fehler besser eingrenzen zu können) könnte das Script mit einer Fehlermeldung abbrechen.
Ein paar Anmerkungen (für technisch Interessierte):
- Wenn ich in Excel eine CSV-Datei öffne, habe ich (je nach Herkunft) eine gute Chance, dass das Semikolon nicht als Trennzeichen interpretiert wird, sondern jeweils die gesamte Zeile in Spalte A steht. Bei manueller Bearbeitung schicke ich dann eben ein "Daten / Text in Spalten..." hinterher. Da mir per Script diese Möglichkeit nicht offen steht (und ich habe es versucht), muss ich Excel austricksen, indem ich den Dateityp ändere - ob auf ".txt" oder auf ".tmp" spielt dabei keine Rolle. Aus Sicherheitesgründen erstelle ich eine temporäre Kopie der CSV im Zielordner (dort sollte es ja tunlichst Schreibrechte geben, und den Pfad dafür muss ich sowieso kennen) und importiere dann eben diese Datei.
- Es ist zwar auch in Excel problemlos möglich (so wie in CMD oder in VBS), mehrere aufeinanderfolgende "\" innerhalb eines Dateipfades zu verwenden - solange es um das Einlesen der Datei geht. Beim Speichern sind einzelne "\" gefragt.
- Da ich mir sehr vorgenommen habe, das Error-Handling von VBS nicht mehr zu kommentieren, nur soviel: An einigen neuralgischen Stellen versuche ich, so gut es geht, Fehler abzufangen (insbesondere, wenn die Excel-Datei - aus welchen Gründen auch immer - nicht gespeichert werden kann, gibt es bei einem Abbruch des Scripts die unschöne Konsequenz, dass der Excel-Prozess nicht beendet wird und dann auch noch die CSV-Datei blockiert - daher musste ich besonderes Augenmerk auf ein ordentliches Beenden des Scripts legen).
Was die weitere Vorgangsweise anlangt: Da das Script jeweils nur eine Datei konvertiert, würde ich zur Steuerung eine Batchdatei mit etwa folgendem Inhalt einsetzen (ungetestet):
Diese Batchdatei könnte per Taskplaner in regelmäßigen Abständen ausgeführt werden (ein Beispiel mit "Biber"-Gütesiegel, allerdings für unregelmäßige Abstände, gibt's hier ...)
Grüße
bastla
Ein Tool kenne ich nicht, aber als Bastellösung für das reine Umwandeln CSV in XLS könntest Du es mit dem folgenden VBScript (ein installiertes Excel vorausgesetzt) versuchen:
'CSV2XLS.vbs
sOutPathDefault = "D:\InXLSKonvertierteCSV" 'Angabe des Default-Zielpfades ohne abschließenden "\"
Set fso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 0 Then
WScript.Echo "Keine Quelldatei angegeben!"
WScript.Quit(1)
End If
sInFile = WScript.Arguments(0)
If Not fso.FileExists(sInFile) Then
WScript.Echo sInFile & " nicht gefunden!"
WScript.Quit(1)
Else 'Pfad der Quelldatei zerlegen
Set oInFile = fso.GetFile(sInFile) 'für vollständige Dateiangaben aus Dateisystem
sInPath = oInFile.Path 'voller Quelldateipfad - wird zum Einlesen verwendet
sInFileName = Left(oInFile.Name, InstrRev(oInFile.Name, ".") - 1) 'Dateiname ohne Pfad und Typ
sInFileType = Mid(oInFile.Name, InstrRev(oInFile.Name, ".")) 'für Überprüfung auf CSV
Set oInFile = Nothing
End If
If WScript.Arguments.Count > 1 Then
sOutFilePath = WScript.Arguments(1) 'angegebenen Zielpfad verwenden
Else
sOutFilePath = sOutPathDefault 'kein Zielpfad angegeben - Default verwenden
End If
If Not fso.FolderExists(sOutFilePath) Then 'Zielpfad nicht vorhanden, daher ...
On Error Resume Next
fso.CreateFolder(sOutFilePath) '... zu erstellen versuchen
If Err.Number > 0 Then
WScript.Echo "Ungueltiger Zielpfad: " & sOutFilePath
WScript.Quit(1)
Else
On Error Goto 0 'Standardfehlerbehandlung wieder einschalten
End If
End If
If LCase(sInFileType) = ".csv" Then 'bei Typ ".csv" für Import in Temp-File kopieren
sInPathTemp = sOutFilePath & "\" & sInFileName & ".tmp" 'Temp-File im Zielverzeichnis anlegen (Annahme: dort Schreibrechte)
fso.CopyFile sInPath, sInPathTemp
sInPath = sInPathTemp 'Daten aus Temp-File lesen
End If
sOutPath = sOutFilePath & "\" & sInFileName & ".xls" 'Zieldateipfad erstellen
Do While InStr(sOutPath, "\\") 'vermeiden doppelter (mehfacher) "\" im Zieldateipfad (stört Excel offensichtlich nur beim Speichern)
sOutPath = Replace(sOutPath, "\\", "\")
Loop
Set oXL = CreateObject("Excel.Application")
With oXL
.Workbooks.OpenText sInPath, , , , , , , True 'Delimiter Semicolon = True
On Error Resume Next
.ActiveWorkbook.ActiveSheet.Cells.EntireColumn.AutoFit 'Optimale Spaltenbreite für alle Spalten setzen
.DisplayAlerts = False 'Keine Rückfrage beim Überschreiben schon vorhandener Zieldatei
.ActiveWorkbook.SaveAs sOutPath, -4143 'Speichern als .xls
If Err.Number > 0 Then
CleanUp
WScript.Echo sOutPath & " konnte nicht gespeichert werden!"
WScript.Quit(1)
End If
End With
CleanUp
Sub CleanUp
oXL.Quit
Set oXL = Nothing
If LCase(sInFileType) = ".csv" Then
On Error Resume Next
fso.DeleteFile sInPathTemp 'temporäre Import-Datei zu löschen versuchen
End If
End Sub
- CSV-Datei importieren (nicht "öffnen" - dazu unten mehr),
- ein ganz klein wenig formatieren (Spaltenbreiten anpassen) und
- als XLS-Datei speichern (da "ohne Benutzereingabe" gewünscht war, wird eine ev bestehende Zieldatei kommentarlos überschrieben).
Zur Verwendung: Das Script erwartet beim Aufruf die Übergabe zumindest einer Importdatei (auch per Drag&Drop oder "SendTo" möglich) mit passendem Inhalt, aber nicht zwingend einem Dateityp ".csv". Zusätzlich kann auch der Zielordner angegeben werden. Wird darauf verzichtet, wird der in Zeile 2 festgelegt Default-Zielpfad verwendet. Sollte der Zielpfad noch nicht existieren, wird versucht, diesen zu erstellen.
Das Script endet mit einem Errorlevel 1, wenn:
- keine Importdatei übergeben wird,
- die Importdatei nicht gefunden wird,
- der Zielordner nicht existiert und auch nicht erstellt werden kann,
- beim Schreiben der XLS-Datei ein Fehler auftritt.
In anderen Fällen (auch, um bei den Tests Fehler besser eingrenzen zu können) könnte das Script mit einer Fehlermeldung abbrechen.
Ein paar Anmerkungen (für technisch Interessierte):
- Wenn ich in Excel eine CSV-Datei öffne, habe ich (je nach Herkunft) eine gute Chance, dass das Semikolon nicht als Trennzeichen interpretiert wird, sondern jeweils die gesamte Zeile in Spalte A steht. Bei manueller Bearbeitung schicke ich dann eben ein "Daten / Text in Spalten..." hinterher. Da mir per Script diese Möglichkeit nicht offen steht (und ich habe es versucht), muss ich Excel austricksen, indem ich den Dateityp ändere - ob auf ".txt" oder auf ".tmp" spielt dabei keine Rolle. Aus Sicherheitesgründen erstelle ich eine temporäre Kopie der CSV im Zielordner (dort sollte es ja tunlichst Schreibrechte geben, und den Pfad dafür muss ich sowieso kennen) und importiere dann eben diese Datei.
- Es ist zwar auch in Excel problemlos möglich (so wie in CMD oder in VBS), mehrere aufeinanderfolgende "\" innerhalb eines Dateipfades zu verwenden - solange es um das Einlesen der Datei geht. Beim Speichern sind einzelne "\" gefragt.
- Da ich mir sehr vorgenommen habe, das Error-Handling von VBS nicht mehr zu kommentieren, nur soviel: An einigen neuralgischen Stellen versuche ich, so gut es geht, Fehler abzufangen (insbesondere, wenn die Excel-Datei - aus welchen Gründen auch immer - nicht gespeichert werden kann, gibt es bei einem Abbruch des Scripts die unschöne Konsequenz, dass der Excel-Prozess nicht beendet wird und dann auch noch die CSV-Datei blockiert - daher musste ich besonderes Augenmerk auf ein ordentliches Beenden des Scripts legen).
Was die weitere Vorgangsweise anlangt: Da das Script jeweils nur eine Datei konvertiert, würde ich zur Steuerung eine Batchdatei mit etwa folgendem Inhalt einsetzen (ungetestet):
@echo off & setlocal
set "Quelle=D:\ZuKonvertierendeCSV"
set "Ablage=D:\KonvertierteCSV"
set "Ziel=D:\AusCSVKonvertierteXLS"
set "Log=D:\Konvertierungsfehler.txt"
if not exist "%Ablage%" md "%Ablage%"
for %%i in (%Quelle%\*.csv) do call :ProcessFile "%%i"
goto :eof
:ProcessFile
cscript //nologo C:\Scripts\CSV2XLS.vbs %1 "%Ziel%">>"%Log%" || goto :eof
move %1 "%Ablage%"
goto :eof
Grüße
bastla
Hallo Bacaaardi!
Diesen Batch kannst Du ohne Parameter aufrufen, dann wird der Default-Ordner (Zeile 2) verwendet oder Du übergibst einen Ordner-Pfad, zB
Das Ziehen des Ordners auf die Batchdatei wäre (wie schon angedeutet) eine weitere Möglichkeit.
Grüße
bastla
Muss ich deinen Ansatz in ein xls file al Makro einfügen??
Nein - es ist ein VB-Script. Wenn Du es als "C:\Scripts\CSV2XLS.vbs" speicherst, sollte auch das Batch-Beispiel von oben funktionieren.Optimal wäre ein *.bat Datei. wenn ich diese in meinem csv ordner habe und dort ausführe. Das dann alles csv in xls umgewandelt werden
Wenn Du das angeführte Beispiel etwas variierst, kannst Du sogar einen Ordner per Drag & Drop konvertieren lassen (wobei die .xls-Dateien und das Log in diesem Ordner abgelegt würden), etwa:@echo off & setlocal
set "Quelle=D:\DefaultOrdner"
If "%~1" neq "" set "Quelle=%~1"
set "Ziel=%Quelle%"
set "Log=%Quelle%\Konvertierungsfehler.txt"
for %%i in (%Quelle%\*.csv) do cscript //nologo C:\Scripts\CSV2XLS.vbs "%%i" "%Ziel%">>"%Log%
ConvertCSV2XLS.bat "D:\Ordner mit vielen XLS"
Weisst du was ich meine???
Ich hatte zumindest eine Vermutung ...Grüße
bastla
Stoppppppp!!!!!!!!!
Es klappt
Ich hab eine csv die im ordner wie die vbs ist einfach in die vbs reingezogen und er hat daraus eine xls in meinen Zielordner gemacht ;) freuuuu
Kann ich auch mehrere Dateien (csv) markieren und per drag and drop in die vbs ziehen, damit er diese auch mehrfach in xls umwandelt???
Es klappt
Ich hab eine csv die im ordner wie die vbs ist einfach in die vbs reingezogen und er hat daraus eine xls in meinen Zielordner gemacht ;) freuuuu
Kann ich auch mehrere Dateien (csv) markieren und per drag and drop in die vbs ziehen, damit er diese auch mehrfach in xls umwandelt???
Hallo Bacaaardi!
Versuch es bitte nochmals mit der oben gepostete Version des Batches und ziehe den Ordner auf die Batchdatei ...
Grüße
bastla
P.S.: Heb' Dir vielleicht noch ein paar von den ??? für weitere Fragen auf ...
Kann ich auch mehrere Dateien (csv) markieren und per drag and drop in die vbs ziehen, damit er diese auch mehrfach in xls umwandelt???
In der aktuellen Fassung des Scripts nicht - dafür ist ja die Batchdatei (die ich inzwischen mit Erfolg getestet habe) gedacht.Versuch es bitte nochmals mit der oben gepostete Version des Batches und ziehe den Ordner auf die Batchdatei ...
Grüße
bastla
P.S.: Heb' Dir vielleicht noch ein paar von den ??? für weitere Fragen auf ...
Also du meinst:
@echo off & setlocal
set "Quelle=D:\DefaultOrdner"
If "%~1" neq "" set "Quelle=%~1"
set "Ziel=%Quelle%"
set "Log=%Quelle%\Konvertierungsfehler.txt"
for %%i in (%Quelle%\*.csv) do cscript //nologo C:\Scripts\CSV2XLS.vbs "%%i" "%Ziel%">>"%Log%
als *.vbs speichern und dann einen Ordner mit mehreren csv in diese vbs ziehen???
Brauch ich dann den Quelltext deines 1. Eintrags nicht???
Sorry wenn dir die Fragen blöd erscheinen
@echo off & setlocal
set "Quelle=D:\DefaultOrdner"
If "%~1" neq "" set "Quelle=%~1"
set "Ziel=%Quelle%"
set "Log=%Quelle%\Konvertierungsfehler.txt"
for %%i in (%Quelle%\*.csv) do cscript //nologo C:\Scripts\CSV2XLS.vbs "%%i" "%Ziel%">>"%Log%
als *.vbs speichern und dann einen Ordner mit mehreren csv in diese vbs ziehen???
Brauch ich dann den Quelltext deines 1. Eintrags nicht???
Sorry wenn dir die Fragen blöd erscheinen
Es klappppptttttt, freu ;)
Du bist der Beste Bastla, vielen vielen Dank
Jetzt noch eine Frage
Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern????
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält???
Und kann man die "Konvertierungsfehler.txt" weglassen??
Du bist der Beste Bastla, vielen vielen Dank
Jetzt noch eine Frage
Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern????
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält???
Und kann man die "Konvertierungsfehler.txt" weglassen??
Hallo Bacaaardi!
In der letzten Zeile den Pfad zur Scriptdatei (C:\Scripts\CSV2XLS.vbs) gegebenen Falles anpassen und als "CSVKonvertierung.bat" (oder wie immer Du magst) speichern. Auf diese Batchdatei dann den Ordner ziehen.
Grüße
bastla
[Edit] Mal wieder zu langsam getippt ... [/Edit]
Also du meinst:
@echo off & setlocal
...
als *.vbs speichern und dann einen Ordner mit mehreren csv in diese vbs ziehen???
Fast - das ist eine Batchdatei, welche das VB-Script für jede einzelne .csv-Datei des übergebenen Ordners aufruft - daher:@echo off & setlocal
...
als *.vbs speichern und dann einen Ordner mit mehreren csv in diese vbs ziehen???
In der letzten Zeile den Pfad zur Scriptdatei (C:\Scripts\CSV2XLS.vbs) gegebenen Falles anpassen und als "CSVKonvertierung.bat" (oder wie immer Du magst) speichern. Auf diese Batchdatei dann den Ordner ziehen.
Sorry wenn dir die Fragen blöd erscheinen
Die stören mich (im Unterschied zu den überzähligen "???" ) überhaupt nicht ...Grüße
bastla
[Edit] Mal wieder zu langsam getippt ... [/Edit]
Es klappppptttttt, freu ;)
Du bist der Beste Bastla, vielen vielen Dank
Jetzt noch eine Frage
Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern?
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält?
Und kann man die "Konvertierungsfehler.txt" weglassen?
Alles mit einem Fragezeichen ;)
Du bist der Beste Bastla, vielen vielen Dank
Jetzt noch eine Frage
Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern?
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält?
Und kann man die "Konvertierungsfehler.txt" weglassen?
Alles mit einem Fragezeichen ;)
Hallo Bacaaardi!
Ist die Ordnerstruktur auf der anderen Platte identisch (so dass sich also nur der Laufwerksbuchstabe ändern würde)?
Weglassen:
Grüße
bastla
P.S.: Momentan habe ich keine Zeit mehr, vielleicht am Abend ...
Jetzt noch eine Frage
Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern?
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält?
Eigentlich war von vielen .csv in einem Ordner die Rede ...Er kopiert mir die xls in genau den Ordner in dem die csv sind
Kann man die xls in einen seperaten Ordner auslagern?
z.B. auf einen andere Platte das er aber die Ordnerstruktur der csv beibehält?
Ist die Ordnerstruktur auf der anderen Platte identisch (so dass sich also nur der Laufwerksbuchstabe ändern würde)?
Und kann man die "Konvertierungsfehler.txt" weglassen?
Kein Problem - nur werden auf diese Art ev Fehlermeldungen des Scripts "verschluckt".Weglassen:
@echo off & setlocal
set "Quelle=D:\DefaultOrdner"
If "%~1" neq "" set "Quelle=%~1"
set "Ziel=%Quelle%"
for %%i in (%Quelle%\*.csv) do cscript //nologo C:\Scripts\CSV2XLS.vbs "%%i" "%Ziel%"
Grüße
bastla
P.S.: Momentan habe ich keine Zeit mehr, vielleicht am Abend ...
@ Bastla halt ;)
Mein Chef muss immer nur eine csv umwandeln
Deine Lösung reicht vollkommen ;)
Mein Chef hat eine bat in der viele csv zu einer zuammengefasst werden. Das klappt prima
Jetzt möchter er aus dieser einen csv eine xls. Was du mir ja gezeigt hast und klappt
Ist es möglich diese beiden bat zu kombinieren so das er in einem schritt die csv zu einer zusammenfasst (diese bat bekomm ich per Email noch zugeschickt) und im nächsten Schritt dein bat zum Zuge kommt in dem er aus dieser csv noch die xls macht?
Mein Chef muss immer nur eine csv umwandeln
Deine Lösung reicht vollkommen ;)
Mein Chef hat eine bat in der viele csv zu einer zuammengefasst werden. Das klappt prima
Jetzt möchter er aus dieser einen csv eine xls. Was du mir ja gezeigt hast und klappt
Ist es möglich diese beiden bat zu kombinieren so das er in einem schritt die csv zu einer zusammenfasst (diese bat bekomm ich per Email noch zugeschickt) und im nächsten Schritt dein bat zum Zuge kommt in dem er aus dieser csv noch die xls macht?
Hallo,
bin durch Zufall auf Ihr Script gestossen. Genau soetwas habe ich
schon länger gesucht. Ich hätte aber noch ein paar Fragen Ich bin leider kein VBS Profi.
1. Wie bzw. wo kann ich ein anderen FieldDelimiter angeben?
2. Wie kann ich einen Textdelimiter angeben
3. Ich habe hier eine CSV Datei, die hat in einer Spalte Zahlenwerte mit
führender Null. Nach der Konvertierung sind diese Zahlenwerte ohne
führende Null.
Kann man über entsprechende Paramteter evtl. auch die Daten als Text
an Excel übergeben?
Mit freundlichem Gruß
Matthias Rebbe
bin durch Zufall auf Ihr Script gestossen. Genau soetwas habe ich
schon länger gesucht. Ich hätte aber noch ein paar Fragen Ich bin leider kein VBS Profi.
1. Wie bzw. wo kann ich ein anderen FieldDelimiter angeben?
2. Wie kann ich einen Textdelimiter angeben
3. Ich habe hier eine CSV Datei, die hat in einer Spalte Zahlenwerte mit
führender Null. Nach der Konvertierung sind diese Zahlenwerte ohne
führende Null.
Kann man über entsprechende Paramteter evtl. auch die Daten als Text
an Excel übergeben?
Mit freundlichem Gruß
Matthias Rebbe
Hallo matthiasr und willkommen im Forum!
Anzupassen ist dazu im Script die Zeile
Da die Fragestellung sehr allgemein gehalten ist, gelten für die folgende (ungetestete) Beispielzeile folgende Annahmen:
1. FieldDelimiter = |
2. Textdelimiter = '
3. Spalte 4 soll als Text eingelesen werden
Die entsprechenden Parameter (dokumentiert in der Online-Hilfe zu "OpenText"):
1. "Other" + "OtherChar"
2. "TextQualifyer"
3. "FieldInfo"
Grüße
bastla
Anzupassen ist dazu im Script die Zeile
.Workbooks.OpenText sInPath, , , , , , , True 'Delimiter Semicolon = True
1. FieldDelimiter = |
2. Textdelimiter = '
3. Spalte 4 soll als Text eingelesen werden
.Workbooks.OpenText sInPath, , , , xlTextQualifierSingleQuote, , , , , , True, "|", Array(Array(4, xlTextFormat))
1. "Other" + "OtherChar"
2. "TextQualifyer"
3. "FieldInfo"
Grüße
bastla
Hallo bastla,
vielen Dank.
Ich habe die Zeile jetzt mal angepasst. Meine CSV hat das Semikolon als Fielddelimiter. Wichtig war mir eigentlich, dass ich Spalte 1 als Text übergebe. Daher sieht meine Zeile jetzt so aus:
.Workbooks.OpenText sInPath, , , , xlTextQualifierDoubleQuote ,,, True, , , ,Array(Array(1, xlTextFormat))
Die Excel-Datei wird auch erstellt, aber in Spalte 1 werden immer noch führende Nullen abgeschnitten.
Habs mit Excel 2002 u. Excel 2007 probiert.
Bin echt ratlos.
Gruß
Matthias
vielen Dank.
Ich habe die Zeile jetzt mal angepasst. Meine CSV hat das Semikolon als Fielddelimiter. Wichtig war mir eigentlich, dass ich Spalte 1 als Text übergebe. Daher sieht meine Zeile jetzt so aus:
.Workbooks.OpenText sInPath, , , , xlTextQualifierDoubleQuote ,,, True, , , ,Array(Array(1, xlTextFormat))
Die Excel-Datei wird auch erstellt, aber in Spalte 1 werden immer noch führende Nullen abgeschnitten.
Habs mit Excel 2002 u. Excel 2007 probiert.
Bin echt ratlos.
Gruß
Matthias
Hallo matthiasr!
Versuch es mit folgender Zeile:
Den Textdelimiter brauchst Du nicht anzugeben, da "DoubleQuote" ohnehin Default ist. Leider hatte ich nicht daran gedacht, dass VBS natürlich keine "xl"-Konstanten kennt - daher ist also "xlTextFormat" durch den zugehörigen Wert 2 zu ersetzen (oder die Zeile
in das Script zu integrieren) ...
Falls Du doch einmal die Angabe des Textdelimiters benötigen solltest:
Grüße
bastla
Versuch es mit folgender Zeile:
.Workbooks.OpenText sInPath, , , , , , , True, , , , , Array(Array(1, 2))
Const xlTextFormat = 2
Falls Du doch einmal die Angabe des Textdelimiters benötigen solltest:
Const xlTextQualifierDoubleQuote = 1
Const xlTextQualifierSingleQuote = 2
Const xlTextQualifierNone = -4142
Grüße
bastla
Hallo,
ich bin durch Zufall gerade auf dieses Script gestoßen, da ich auf der Suche nach einer Lösung für mein Problem bin. Ich versuchs mal zu Schildern:
Momentan bekomme ich jeden Tag mehrere Geschäftsemails auf mein iPhone, mit csv-Anhängen, die zeitnah kontrolliert werden müssen. Da das Handy aber kein csv im Emailanhang lesen kann, muss ich auf ein anderes, brauchbares Format umschwenken. Ich hab mir hier mal frecherweise das vbs-Script kopiert und ausprobiert, und bin erfolgreich gewesen, allerdings brauche ich nun Hilfe, um das ganze weiter zu automatisieren.
Erstmal den Ist-Stand:
Ich habe in einem Entfernten Rechenzentrum eine Anwendung laufen, das mir mehrfach täglich eine csv-Datei generiert (immer zu festen Uhrzeiten), und diese anschliessend direkt per Email an mehrere Adressen versendet. Diese sind aber leider nur am PC lesbar, nicht am iPhone (Diensthandy).
Wunschzustand:
Die Anwendung generiert die besagte csv-Datei und legt diese in ein definiertes Verzeichnis ab (leicht konfigurierbar). In genau dieses Verzeichnis soll der Konverter mit hinein, und ebenfalls zu festen Zeitpunkten (am besten kurz nach Ablage der csv-Datei in diesem Verzeichnis) alle csv-Dateien (ich sag bewusst alle, da morgens 2 Dateien abgelegt werden und nachmittags 1), die maximal 1 Stunde dort liegen, und generiert hieraus die entsprechenden Excel-Dateien. Jetzt wiederum müssten automatisiert die frisch erzeugten Excel-Dateien aufgegriffen und per Mail an ihren Bestimmungsort geschickt werden.
Wenn jemand Lust hat, mir hier ein bißchen unter die Arme zu greifen, wäre ich da sehr sehr dankbar für.
Gruß,
Thomas
ich bin durch Zufall gerade auf dieses Script gestoßen, da ich auf der Suche nach einer Lösung für mein Problem bin. Ich versuchs mal zu Schildern:
Momentan bekomme ich jeden Tag mehrere Geschäftsemails auf mein iPhone, mit csv-Anhängen, die zeitnah kontrolliert werden müssen. Da das Handy aber kein csv im Emailanhang lesen kann, muss ich auf ein anderes, brauchbares Format umschwenken. Ich hab mir hier mal frecherweise das vbs-Script kopiert und ausprobiert, und bin erfolgreich gewesen, allerdings brauche ich nun Hilfe, um das ganze weiter zu automatisieren.
Erstmal den Ist-Stand:
Ich habe in einem Entfernten Rechenzentrum eine Anwendung laufen, das mir mehrfach täglich eine csv-Datei generiert (immer zu festen Uhrzeiten), und diese anschliessend direkt per Email an mehrere Adressen versendet. Diese sind aber leider nur am PC lesbar, nicht am iPhone (Diensthandy).
Wunschzustand:
Die Anwendung generiert die besagte csv-Datei und legt diese in ein definiertes Verzeichnis ab (leicht konfigurierbar). In genau dieses Verzeichnis soll der Konverter mit hinein, und ebenfalls zu festen Zeitpunkten (am besten kurz nach Ablage der csv-Datei in diesem Verzeichnis) alle csv-Dateien (ich sag bewusst alle, da morgens 2 Dateien abgelegt werden und nachmittags 1), die maximal 1 Stunde dort liegen, und generiert hieraus die entsprechenden Excel-Dateien. Jetzt wiederum müssten automatisiert die frisch erzeugten Excel-Dateien aufgegriffen und per Mail an ihren Bestimmungsort geschickt werden.
Wenn jemand Lust hat, mir hier ein bißchen unter die Arme zu greifen, wäre ich da sehr sehr dankbar für.
Gruß,
Thomas
Hallo Doctor Gremlin!
Wenn das Script offensichtlich bei Dir funktioniert, ist eigentlich der Quellcode kein Thema ...
... abgesehen davon: Der Batch (aus meinem ersten Kommentar), mit dem alle Dateien eines Ordners umgewandelt werden können, sollte sich ja an Deine Ordnerstruktur anpassen und dann über den Taskplaner starten lassen, sodass Du nur noch am Ende des Batches einen Aufruf von zB "hier) ergänzen musst, um damit die konvertierten Dateien zu versenden.
Grüße
bastla
Wenn das Script offensichtlich bei Dir funktioniert, ist eigentlich der Quellcode kein Thema ...
... abgesehen davon: Der Batch (aus meinem ersten Kommentar), mit dem alle Dateien eines Ordners umgewandelt werden können, sollte sich ja an Deine Ordnerstruktur anpassen und dann über den Taskplaner starten lassen, sodass Du nur noch am Ende des Batches einen Aufruf von zB "hier) ergänzen musst, um damit die konvertierten Dateien zu versenden.
Grüße
bastla
Hallo Bastla,
danke für die Tips, die Batchdatei hatte ich komplett übersehen, funktioniert mit kleinen Anpassungen sehr gut. Allerdings werde ich vor ein Rätsel gestellt.
Ich bekomme täglich 3 Dateien, 2 vormittags und eine nachmittags. Diese werden aus der selben Vorlage erstellt, und mit unterschiedlichen Daten gefüllt.
Morgens hat eine Datei zB hat 37 Zeilen und 18 Spalten, die andere 37 Zeilen und 8 Spalten. Nachmittags die Datei hat wiederrum 37 Zeilen und 18 Spalten.
Morgens die 8er Datei und nachmittags die 18er Datei werden perfekt konvertiert nach XLS, aber die morgens 18er Datei geht in die Hose, da drückt er mir sämtliche Inhalte in Spalte A, warum auch immer.
Anschliessender Datenversand geht auch reibungslos mit blat.
danke für die Tips, die Batchdatei hatte ich komplett übersehen, funktioniert mit kleinen Anpassungen sehr gut. Allerdings werde ich vor ein Rätsel gestellt.
Ich bekomme täglich 3 Dateien, 2 vormittags und eine nachmittags. Diese werden aus der selben Vorlage erstellt, und mit unterschiedlichen Daten gefüllt.
Morgens hat eine Datei zB hat 37 Zeilen und 18 Spalten, die andere 37 Zeilen und 8 Spalten. Nachmittags die Datei hat wiederrum 37 Zeilen und 18 Spalten.
Morgens die 8er Datei und nachmittags die 18er Datei werden perfekt konvertiert nach XLS, aber die morgens 18er Datei geht in die Hose, da drückt er mir sämtliche Inhalte in Spalte A, warum auch immer.
Anschliessender Datenversand geht auch reibungslos mit blat.
Hallo Doctor Gremlin!
Ev Unicode? Falls ja (und sich tatsächlich das Problem daraus ergäbe), ließe sich durch ein vorangehendes
eine Konvertierung nach ANSI in den Batch einbauen.
Wenn Du die Datei mit einem vernünftigen Texteditor (etwa Notepad++) oder einem Hexeditor öffnest, kannst Du Dir auch enthaltene Sonderzeichen anzeigen lassen (in Notepad++: "Ansicht / Alle Zeichen anzeigen") und so ev Auffälligkeiten erkennen - eine Ferndiagnose ist etwas schwierig ...
Grüße
bastla
Ev Unicode? Falls ja (und sich tatsächlich das Problem daraus ergäbe), ließe sich durch ein vorangehendes
type Datei.csv>Datei.bak
move Datei.bak Datei.csv
Wenn Du die Datei mit einem vernünftigen Texteditor (etwa Notepad++) oder einem Hexeditor öffnest, kannst Du Dir auch enthaltene Sonderzeichen anzeigen lassen (in Notepad++: "Ansicht / Alle Zeichen anzeigen") und so ev Auffälligkeiten erkennen - eine Ferndiagnose ist etwas schwierig ...
Grüße
bastla
Hallo Bastla,
ich hab es zwischenzeitlich gelöst bekommen, ich habe die Anzahl der "freiwillig" mitgelieferten Infos ein wenig reduziert, und jetzt funktioniert es.
Jetzt brauch ich nur noch eine Möglichkeit, in der Batchdatei, die die Konvertierung ausführt, das blat-Kommando mit einzubauen, damit ich nur einen Task planen muss.
Eine Idee dazu?
Momentan sieht es so aus, aber geht leider nicht:
@echo off & setlocal
set "Quelle=c:\test\CSVerstellt"
set "Ablage=c:\test\CSVkonvertiert"
set "Ziel=c:\test\XLSerstellt"
set "Log=c:\test\Konvertierungsfehler.txt"
if not exist "%Ablage%" md "%Ablage%"
for %%i in (%Quelle%\*.csv) do call :ProcessFile "%%i"
goto :eof
:ProcessFile
move %1 "%Ablage%"
goto :eof
@echo
c:\test\blat262\full\blat.exe .... (persönliche Infos weggelassen, aber der Emailversand mit Anhängen funktioniert).
Wenn Du mir das noch kurz erklären würdest, wie ich das hinbekomme, hättest Du mir seeeehr viel weitergeholfen.
Und ein hausgemachtes Problem hab ich noch, auf dem Rechner, wo das Script dann laufen soll, ist kein Excel installiert (wegen Lizenzgründen). Gibt es eine Möglichkeit, das auch ohne installiertes Excel zum laufen zu bewegen? (Die Anfrage für das Installieren läuft momentan, ist aber mit Kosten verbunden, die man ja evtl. umgehen könnte). Wenn es keine Möglichkeit ohne Excel gibt, muss es halt gekauft und installiert werden, daran solls nicht scheitern, aber evtl. geht es ja ohne.
Gruß,
Doc
ich hab es zwischenzeitlich gelöst bekommen, ich habe die Anzahl der "freiwillig" mitgelieferten Infos ein wenig reduziert, und jetzt funktioniert es.
Jetzt brauch ich nur noch eine Möglichkeit, in der Batchdatei, die die Konvertierung ausführt, das blat-Kommando mit einzubauen, damit ich nur einen Task planen muss.
Eine Idee dazu?
Momentan sieht es so aus, aber geht leider nicht:
@echo off & setlocal
set "Quelle=c:\test\CSVerstellt"
set "Ablage=c:\test\CSVkonvertiert"
set "Ziel=c:\test\XLSerstellt"
set "Log=c:\test\Konvertierungsfehler.txt"
if not exist "%Ablage%" md "%Ablage%"
for %%i in (%Quelle%\*.csv) do call :ProcessFile "%%i"
goto :eof
:ProcessFile
goto :eof
@echo
c:\test\blat262\full\blat.exe .... (persönliche Infos weggelassen, aber der Emailversand mit Anhängen funktioniert).
Wenn Du mir das noch kurz erklären würdest, wie ich das hinbekomme, hättest Du mir seeeehr viel weitergeholfen.
Und ein hausgemachtes Problem hab ich noch, auf dem Rechner, wo das Script dann laufen soll, ist kein Excel installiert (wegen Lizenzgründen). Gibt es eine Möglichkeit, das auch ohne installiertes Excel zum laufen zu bewegen? (Die Anfrage für das Installieren läuft momentan, ist aber mit Kosten verbunden, die man ja evtl. umgehen könnte). Wenn es keine Möglichkeit ohne Excel gibt, muss es halt gekauft und installiert werden, daran solls nicht scheitern, aber evtl. geht es ja ohne.
Gruß,
Doc
Ok hat sich erledigt, hab es rausbekommen, ohne den passenden Call konnte das ja nicht gehen. Ich gebe zu, meine Programmierkenntnisse sind ein wenig eingerostet...
Hiermit ging es dann in einem Aufruf:
@echo off & setlocal
set "Quelle=c:\test\CSVerstellt"
set "Ablage=c:\test\CSVkonvertiert"
set "Ziel=c:\test\XLSerstellt"
set "Log=c:\test\Konvertierungsfehler.txt"
if not exist "%Ablage%" md "%Ablage%"
for %%i in (%Quelle%\*.csv) do call :ProcessFile "%%i"
call :email
goto :eof
:ProcessFile
move %1 "%Ablage%"
goto :eof
:email
c:\test\blat262\full\blat.exe...
Bleibt nun noch die Frage nach der Ausführbarkeit ohne Excel offen...
Hiermit ging es dann in einem Aufruf:
@echo off & setlocal
set "Quelle=c:\test\CSVerstellt"
set "Ablage=c:\test\CSVkonvertiert"
set "Ziel=c:\test\XLSerstellt"
set "Log=c:\test\Konvertierungsfehler.txt"
if not exist "%Ablage%" md "%Ablage%"
for %%i in (%Quelle%\*.csv) do call :ProcessFile "%%i"
call :email
goto :eof
:ProcessFile
goto :eof
c:\test\blat262\full\blat.exe...
Bleibt nun noch die Frage nach der Ausführbarkeit ohne Excel offen...
Hallo frentic und willkommen im Forum!
Lässt sich ohne konkrete Kenntnis Deiner csv-Datei natürlich nicht nachvollziehen - was Du aber versuchen könntest, wäre, in Zeile 52 unmittelbar nach dem "sInPath" die Herkunft der Daten festzulegen - anstatt
zB
wenn die Ausgangsdatei im "MSDOS-Format" (also als ASCII) erstellt wurde.
Alternativ zu "2" kann dort auch die Codepage angeführt werden - dazu könntest Du die csv-Datei auf *.txt umbenennen und sie dann mit Excel öffnen. Im automatisch startenden Textkonvertierungsassistenten wirst Du nach dem "Dateiursprung" gefragt. Hier kannst Du dann verschiedene Einstellungen ausprobieren und siehst in der Vorschau auch gleich, ob es damit passt. Wenn Du die Herkunft herausgefunden hast, kannst Du die vor dem Doppelpunkt stehende Zahl (zB 852 für "Mitteleuropäisch (DOS)") in der obigen Zeile als Codepage verwenden ...
Grüße
bastla
Lässt sich ohne konkrete Kenntnis Deiner csv-Datei natürlich nicht nachvollziehen - was Du aber versuchen könntest, wäre, in Zeile 52 unmittelbar nach dem "sInPath" die Herkunft der Daten festzulegen - anstatt
.Workbooks.OpenText sInPath, , , , , , , True
.Workbooks.OpenText sInPath, 2, , , , , , True
Alternativ zu "2" kann dort auch die Codepage angeführt werden - dazu könntest Du die csv-Datei auf *.txt umbenennen und sie dann mit Excel öffnen. Im automatisch startenden Textkonvertierungsassistenten wirst Du nach dem "Dateiursprung" gefragt. Hier kannst Du dann verschiedene Einstellungen ausprobieren und siehst in der Vorschau auch gleich, ob es damit passt. Wenn Du die Herkunft herausgefunden hast, kannst Du die vor dem Doppelpunkt stehende Zahl (zB 852 für "Mitteleuropäisch (DOS)") in der obigen Zeile als Codepage verwenden ...
Grüße
bastla