36831
Goto Top

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

Content-Key: 67477

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

Printed on: April 19, 2024 at 09:04 o'clock

Member: bastla
Solution bastla Sep 01, 2007, updated at Dec 24, 2015 at 10:14:31 (UTC)
Goto Top
Hallo "Kürzester-bekannter-Nick"-Inhaber face-wink!

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
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):
@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
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
Mitglied: 36831
36831 Sep 01, 2007 at 13:33:49 (UTC)
Goto Top
Moin bastla,

Danke dir erstmal für das Script.

habe eben einen Schnelltest mit einer aus Excel2003 erstellten CSV-Datei gemacht. Sah gut aus. (Hab eigentlich auch nichts anderes erwartet face-smile )

Leider kann ich das ganze erst am 10.09. mit den Dateien testen, auf die es ankommt, da ich in der kommenden Woche Schule habe und erst danach wieder auf der Arbeit sein werde.

Ich melde mich dann wieder.

Gruß,
VW
Mitglied: 36831
36831 Sep 11, 2007 at 12:49:29 (UTC)
Goto Top
Moin,

nachdem ich heute leider erst dazu gekommen bin, das Script zu testen, muss ich sagen, es funktioniert SEEEHR gut.

Danke an Bastla nochmal.

MfG,
VW
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 13:27:14 (UTC)
Goto Top
Muss ich deinen Ansatz in ein xls file al Makro einfügen??

Steh voll auf dem schlauch face-sad

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


Weisst du was ich meine???

Gruß

Julia
Member: bastla
bastla Sep 11, 2007 at 13:38:48 (UTC)
Goto Top
Hallo Bacaaardi!

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%  
Diesen Batch kannst Du ohne Parameter aufrufen, dann wird der Default-Ordner (Zeile 2) verwendet oder Du übergibst einen Ordner-Pfad, zB
ConvertCSV2XLS.bat "D:\Ordner mit vielen XLS"  
Das Ziehen des Ordners auf die Batchdatei wäre (wie schon angedeutet) eine weitere Möglichkeit.

Weisst du was ich meine???
Ich hatte zumindest eine Vermutung ...

Grüße
bastla
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 13:47:26 (UTC)
Goto Top
Sorry es klappt aber nicht face-sad

Immer noch die gleiche Meldung
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 13:53:43 (UTC)
Goto Top
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???
Member: bastla
bastla Sep 11, 2007 at 14:05:00 (UTC)
Goto Top
Hallo Bacaaardi!

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 ... face-wink
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 14:10:05 (UTC)
Goto Top
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 erscheinenface-smile
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 14:20:20 (UTC)
Goto Top
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??
Member: bastla
bastla Sep 11, 2007 at 14:21:56 (UTC)
Goto Top
Hallo Bacaaardi!

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:
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 face-smile
Die stören mich (im Unterschied zu den überzähligen "???" face-wink) überhaupt nicht ...

Grüße
bastla

[Edit] Mal wieder zu langsam getippt ... [/Edit]
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 14:22:59 (UTC)
Goto Top
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 ;)
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 14:27:03 (UTC)
Goto Top
Ich weiss ich bin eine Nervensäge ;)


Kann mann mehrere Ordner markieren und über die *.bat umwandeln lassen


Es wäre genial wenn ich einen Ordner in die *.bat ziehe und dort alle Unterordner mit umgewandelt werden

Oder geht das nicht?
Member: bastla
bastla Sep 11, 2007 at 14:33:31 (UTC)
Goto Top
Hallo Bacaaardi!

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

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 ...
Member: Bacaaardi
Bacaaardi Sep 11, 2007 at 14:34:01 (UTC)
Goto Top
@ 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?
Member: Bacaaardi
Bacaaardi Sep 12, 2007 at 06:18:20 (UTC)
Goto Top
Hallo Bastla

in der 2. Zeile habe ich folgendes stehen:

sOutPathDefault = "H:\csv2xls\xls" 'Angabe des Default-Zielpfades ohne abschließenden "\"


wie kann ich den Code ändern, dass die erstellte xls immer im gleichen Ordner wie die csv auftaucht?
Member: bastla
bastla Sep 12, 2007 at 10:44:08 (UTC)
Goto Top
Hallo Bacaaardi!

In diesem Fall könntest Du die Zeile
sOutFilePath = sOutPathDefault 'kein Zielpfad angegeben - Default verwenden  
ändern auf
sOutFilePath = Left(sInPath, InStrRev(sInPath, "\") - 1) 'Pfad der Quelldatei verwenden  

Grüße
bastla
Mitglied: 36831
36831 Sep 25, 2007 at 21:46:59 (UTC)
Goto Top
Moin,

ich setze den Beitrag jetzt mal, da hier ja nichts mehr zu passieren scheint, auf gelöst.

Ansonsten meldet euch einfach per PN.

MfG,
VW
Member: matthiasr
matthiasr Jan 10, 2008 at 16:58:20 (UTC)
Goto Top
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
Member: bastla
bastla Jan 11, 2008 at 00:07:03 (UTC)
Goto Top
Hallo matthiasr und willkommen im Forum!

Anzupassen ist dazu im Script die Zeile
.Workbooks.OpenText sInPath, , , , , , , True 'Delimiter Semicolon = True  
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
.Workbooks.OpenText sInPath, , , , xlTextQualifierSingleQuote, , , , , , True, "|", Array(Array(4, xlTextFormat))  
Die entsprechenden Parameter (dokumentiert in der Online-Hilfe zu "OpenText"):

1. "Other" + "OtherChar"
2. "TextQualifyer"
3. "FieldInfo"

Grüße
bastla
Member: matthiasr
matthiasr Jan 11, 2008 at 14:56:06 (UTC)
Goto Top
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
Member: bastla
bastla Jan 11, 2008 at 17:56:16 (UTC)
Goto Top
Hallo matthiasr!

Versuch es mit folgender Zeile:
.Workbooks.OpenText sInPath, , , , , , , True, , , , , Array(Array(1, 2))
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
Const xlTextFormat = 2
in das Script zu integrieren) ...

Falls Du doch einmal die Angabe des Textdelimiters benötigen solltest:
Const xlTextQualifierDoubleQuote = 1
Const xlTextQualifierSingleQuote = 2
Const xlTextQualifierNone = -4142

Grüße
bastla
Member: matthiasr
matthiasr Jan 11, 2008 at 19:16:10 (UTC)
Goto Top
Super,

vielen Dank. Jetzt funktioniert es.

Ich glaube, ich werde mich doch mal ein bisschen mehr mit VBS beschäftigen müssen.

Gruß

Matthias
Mitglied: 36831
36831 Jan 11, 2008 at 19:17:31 (UTC)
Goto Top
Moin,

denn setz ich gelöst erstmal wieder.
Oder gibt es noch irgendwelche weiteren offenen Fragen?

MfG,
VW
Member: DoctorGremlin
DoctorGremlin Oct 08, 2008 at 21:11:11 (UTC)
Goto Top
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
Member: bastla
bastla Oct 08, 2008 at 21:20:18 (UTC)
Goto Top
Hallo Doctor Gremlin!

Dafür bietet sich eher ein neuer Thread an ...

Grüße
bastla
Member: DoctorGremlin
DoctorGremlin Oct 08, 2008 at 21:22:56 (UTC)
Goto Top
Hallo Bastla,

insgeheim hatte ich auf eine schnelle Antwort von Dir gehofft, allerdings eher in Form einer Lösung.
Ich wollte es hier in dem Thread eigentlich halten, da hier auch der Quellcode von dem Konverter mitgenannt ist.
Member: bastla
bastla Oct 08, 2008, updated at Oct 18, 2012 at 16:36:21 (UTC)
Goto Top
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
Member: DoctorGremlin
DoctorGremlin Oct 09, 2008 at 09:09:32 (UTC)
Goto Top
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.
Member: bastla
bastla Oct 09, 2008 at 09:50:25 (UTC)
Goto Top
Hallo Doctor Gremlin!

die morgens 18er Datei geht in die Hose, da drückt er mir sämtliche Inhalte in Spalte A
Da drängt sich natürlich die Frage nach dem Trennzeichen auf ...

Grüße
bastla
Member: DoctorGremlin
DoctorGremlin Oct 09, 2008 at 11:18:34 (UTC)
Goto Top
Hi,
Trennzeichen ist immer ein Semikolon, und in allen Dateien gleich.
Member: bastla
bastla Oct 09, 2008 at 12:33:00 (UTC)
Goto Top
Hallo Doctor Gremlin!

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
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
Member: DoctorGremlin
DoctorGremlin Oct 10, 2008 at 07:59:53 (UTC)
Goto Top
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
Member: DoctorGremlin
DoctorGremlin Oct 10, 2008 at 08:24:00 (UTC)
Goto Top
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...
Member: frentic
frentic Dec 16, 2015 at 09:35:18 (UTC)
Goto Top
Hallo Bastla,

das Script ist super, leider habe ich ein Problem, dass in der erzeugten Excel-Datei die Umlaute nicht passen.
Kannst du mir helfen?

cu Frentic
Member: bastla
Solution bastla Dec 16, 2015, updated at Dec 24, 2015 at 10:14:44 (UTC)
Goto Top
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
.Workbooks.OpenText sInPath, , , , , , , True
zB
.Workbooks.OpenText sInPath, 2, , , , , , True
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