Eine Exel Tabelle in eine .csv Datei mit einer Batch inclusive einige Änderungen
Hallo ich habe schon lange das Forum nicht mehr besucht und freue mich auf eure Antworten.
Ich brauche Beschreibe mal mein Anliegen und hoffe es klappt wie ich es glaube.
Hintergrund: ich exportiere Adressaten aus einem Programm. Dabei wird eine .xls erstellt mit 3 Spalten die wie folgt aufgebaut ist.
Spalte1: adressnummer
Spalte2: Name Nachname
Spalte3: e-mailadresse
Soweit so gut, doch nun sollen die Adressen in ein Newsletter Programm importiert werden.
Doch hier gibt es ein Problem, denn es muss eine csv sein und mit Komma getrennt.
Der Aufbau muss aber so aussehen
Name Nachname , E-Mailadresse , 1 , 1
Spalte1 aus der xls soll also verschwinden und es sollen 2 neue spalten hinten dran mit 1 gefüllt werden.
Nun gibt es aber auch in der Spalte2 oft den Fall , dass der Name getrennt ist mit einem Komma und dann steht
In Spalte2 eben " Name , Nachname" und der Import schlägt dann fehl.
Idee war also erst mal die xls als .csv wandeln aber getrennt mit einem ; und es sollen alle , gelöscht werden.
Danach zurück in eine .xls und das ohne der ursprünglichen Spalte1 und die Zahl 1 in dann Spalte 3 und 4.
Jetzt gibt's also keine Komma Zeichen mehr und nun zurück in .csv mit Komma getrennt.
Geht das überhaupt mit Batch?? Klappt das alles in eine Batch-Datei??
Leider habe ich beim großem G Bruder nichts gefunden.
Ich danke schon mal
Underdog81
Ich brauche Beschreibe mal mein Anliegen und hoffe es klappt wie ich es glaube.
Hintergrund: ich exportiere Adressaten aus einem Programm. Dabei wird eine .xls erstellt mit 3 Spalten die wie folgt aufgebaut ist.
Spalte1: adressnummer
Spalte2: Name Nachname
Spalte3: e-mailadresse
Soweit so gut, doch nun sollen die Adressen in ein Newsletter Programm importiert werden.
Doch hier gibt es ein Problem, denn es muss eine csv sein und mit Komma getrennt.
Der Aufbau muss aber so aussehen
Name Nachname , E-Mailadresse , 1 , 1
Spalte1 aus der xls soll also verschwinden und es sollen 2 neue spalten hinten dran mit 1 gefüllt werden.
Nun gibt es aber auch in der Spalte2 oft den Fall , dass der Name getrennt ist mit einem Komma und dann steht
In Spalte2 eben " Name , Nachname" und der Import schlägt dann fehl.
Idee war also erst mal die xls als .csv wandeln aber getrennt mit einem ; und es sollen alle , gelöscht werden.
Danach zurück in eine .xls und das ohne der ursprünglichen Spalte1 und die Zahl 1 in dann Spalte 3 und 4.
Jetzt gibt's also keine Komma Zeichen mehr und nun zurück in .csv mit Komma getrennt.
Geht das überhaupt mit Batch?? Klappt das alles in eine Batch-Datei??
Leider habe ich beim großem G Bruder nichts gefunden.
Ich danke schon mal
Underdog81
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 169781
Url: https://administrator.de/forum/eine-exel-tabelle-in-eine-csv-datei-mit-einer-batch-inclusive-einige-aenderungen-169781.html
Ausgedruckt am: 24.12.2024 um 13:12 Uhr
33 Kommentare
Neuester Kommentar
Guten Abend,
also ich würde erstmal in der zweiten Spalte die Kommata durch Semikolon ersetzten, dann löschst Du Spalte 1, trägst in den Spalten 4 und 5 die Einsen ein und speicherst dann als *.csv mit Komma als Separator.
Mit Batch läuft da nix, das kannst Du vergessen. Excel kann selbst gut genug mit csv-Dateien umgehen.
Markus
also ich würde erstmal in der zweiten Spalte die Kommata durch Semikolon ersetzten, dann löschst Du Spalte 1, trägst in den Spalten 4 und 5 die Einsen ein und speicherst dann als *.csv mit Komma als Separator.
Mit Batch läuft da nix, das kannst Du vergessen. Excel kann selbst gut genug mit csv-Dateien umgehen.
Markus
Naja, gehen tut das mit Batch bestimmt, aber das ist (m.E.) der falsche Ansatz.
Guck Dir doch erstmal die Spalte mit den Namen an. Dann mach folgendes, Spalte markieren, anderes Tabellenblatt, dort die ganze Spalte einfügen, dann Ersetzten lassen, also ";" durch " " (Leerzeichen). Danach die Spalte wieder kopieren und in die ursprüngliche Tabelle (anstatt der alten Spalte 2) einfügen.
Dann sind die Kommata weg.
Jetzt löschst Du Spalte 1.
Dann fügst Du in Spalte 3 und 4 die gewünschten Einsen ein (also jeweils erste und zweite Zeile die 1 rein, danach markieren und runterziehen bis zur letzten Zeile).
Danach speicherst Du "Speichern unter" als csv-Datei ab und gibst als Separator das Komma an.
Das war's eigentlich.
Oder noch eine Frage: wie fit bist Du mit Excel?
Markus
Guck Dir doch erstmal die Spalte mit den Namen an. Dann mach folgendes, Spalte markieren, anderes Tabellenblatt, dort die ganze Spalte einfügen, dann Ersetzten lassen, also ";" durch " " (Leerzeichen). Danach die Spalte wieder kopieren und in die ursprüngliche Tabelle (anstatt der alten Spalte 2) einfügen.
Dann sind die Kommata weg.
Jetzt löschst Du Spalte 1.
Dann fügst Du in Spalte 3 und 4 die gewünschten Einsen ein (also jeweils erste und zweite Zeile die 1 rein, danach markieren und runterziehen bis zur letzten Zeile).
Danach speicherst Du "Speichern unter" als csv-Datei ab und gibst als Separator das Komma an.
Das war's eigentlich.
Oder noch eine Frage: wie fit bist Du mit Excel?
Markus
Hallo Underdog,
Batch ist zu unsicher zum bearbeiten von Textdateien. Ein Namensfeld wie "Hans & Maria Maier" wäre schon ein Problem, wegen dem "&". Für sowas eignet sich VBScript besser.
Was ist denn eigentlich mit diesen Namensfeldern. Erwartet das Newsletterprogramm Vor- und Nachname getrennt in zwei Zellen der CSV oder zusammen in einer Zelle?
Gruß
Friemler
Batch ist zu unsicher zum bearbeiten von Textdateien. Ein Namensfeld wie "Hans & Maria Maier" wäre schon ein Problem, wegen dem "&". Für sowas eignet sich VBScript besser.
Was ist denn eigentlich mit diesen Namensfeldern. Erwartet das Newsletterprogramm Vor- und Nachname getrennt in zwei Zellen der CSV oder zusammen in einer Zelle?
Gruß
Friemler
Hallo Zusammen.
Zwischenfrage:
Du bist sicher, dass wirklich eine "echte" Exceldatei erstellt wird, oder ist es nur ein Format, dass Excel als Tabelle verarbeiten kann und die Endung .xls trägt?
Öffne die Datei mal in einem Texteditor. Wenn du tatsächlich nur cryptisches Zeug siehst, kommst du da per Batch nicht ran. Könnte aber auch anders sein...
Grüße
rubberman
Zitat von @Underdog81:
Hintergrund: ich exportiere Adressaten aus einem Programm. Dabei wird eine .xls erstellt ...
Hintergrund: ich exportiere Adressaten aus einem Programm. Dabei wird eine .xls erstellt ...
Zwischenfrage:
Du bist sicher, dass wirklich eine "echte" Exceldatei erstellt wird, oder ist es nur ein Format, dass Excel als Tabelle verarbeiten kann und die Endung .xls trägt?
Öffne die Datei mal in einem Texteditor. Wenn du tatsächlich nur cryptisches Zeug siehst, kommst du da per Batch nicht ran. Könnte aber auch anders sein...
Grüße
rubberman
Aloha,
nun, mit batch wäre es möglich und auch nicht einmal unbedingt aufwändig aber (abgesehen davon, dass ich heute keine Lust dazu habe) als Anmerkung wollte ich noch bringen: OpenOffice kann auch mit verschiedenen Trennzeichen arbeiten (importieren und exportieren), das könnte schon einmal einen Schritt verkürzen(?)
greetz André
nun, mit batch wäre es möglich und auch nicht einmal unbedingt aufwändig aber (abgesehen davon, dass ich heute keine Lust dazu habe) als Anmerkung wollte ich noch bringen: OpenOffice kann auch mit verschiedenen Trennzeichen arbeiten (importieren und exportieren), das könnte schon einmal einen Schritt verkürzen(?)
greetz André
Hallo Underdog,
teste mal das hier:
Speichere das obige Script z.B. als ConvertExport.vbs.
Du musst die exportierte XLS-Datei erstmal in Excel laden und als CSV speichern. Das Icon dieser neu erzeugten Datei kannst Du auf das Icon des obigen Scripts ziehen. Es wird dann eine neue Datei erzeugt, deren Namen um den Zusatz "_Neu" ergänzt wurde (aus "Eport.csv" wird "Export_Neu.csv").
In Zeile 5 kannst Du angeben, durch was ein Komma im Namensfeld ersetzt werden soll. Ich habe hier mal "nichts" gewählt. Wenn es sein muss, setze ein Leerzeichen zwischen die Anführungszeichen.
Gruß
Friemler
teste mal das hier:
Const ForReading = 1
Const ForWriting = 2
strReplace = ""
If WScript.Arguments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFilePath = objFSO.GetParentFolderName(WScript.Arguments(0))
strFileName = objFSO.GetBaseName(WScript.Arguments(0))
strFileExt = objFSO.GetExtensionName(WScript.Arguments(0))
Set objInFile = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False)
Set objOutFile = objFSO.OpenTextFile(objFSO.BuildPath(strFilePath, strFileName & "_Neu" & "." & strFileExt), ForWriting, True)
While Not objInFile.AtEndOfStream
arrFields = Split(objInFile.ReadLine, ";")
objOutFile.WriteLine Replace(arrFields(1), ",", strReplace) & "," & arrFields(2) & "," & "1,1"
Wend
objOutFile.Close
objInFile.Close
End If
Speichere das obige Script z.B. als ConvertExport.vbs.
Du musst die exportierte XLS-Datei erstmal in Excel laden und als CSV speichern. Das Icon dieser neu erzeugten Datei kannst Du auf das Icon des obigen Scripts ziehen. Es wird dann eine neue Datei erzeugt, deren Namen um den Zusatz "_Neu" ergänzt wurde (aus "Eport.csv" wird "Export_Neu.csv").
In Zeile 5 kannst Du angeben, durch was ein Komma im Namensfeld ersetzt werden soll. Ich habe hier mal "nichts" gewählt. Wenn es sein muss, setze ein Leerzeichen zwischen die Anführungszeichen.
Gruß
Friemler
Hallo Underdog81!
Irgendwie bin ich ein wenig verwirrt, denn in Deinem 1. Beitrag schreibst Du, dass eine .xls-Datei in folgendem Format vorliegt (in Spalten...) und später taucht die Frage auf, ob es denn eine Excel-Datei ist oder nicht und Du schreibst, dass Du das erst noch prüfen musst?
Ist die .xls nun ne Excel-Datei oder nicht? Und wenn ja, wird der Name in den Spalten auch mit/ohne Komma korrekt angezeigt?
Gruß Dieter
Irgendwie bin ich ein wenig verwirrt, denn in Deinem 1. Beitrag schreibst Du, dass eine .xls-Datei in folgendem Format vorliegt (in Spalten...) und später taucht die Frage auf, ob es denn eine Excel-Datei ist oder nicht und Du schreibst, dass Du das erst noch prüfen musst?
Ist die .xls nun ne Excel-Datei oder nicht? Und wenn ja, wird der Name in den Spalten auch mit/ohne Komma korrekt angezeigt?
Gruß Dieter
Hallo Underdog,
wenn das
wirklich der Inhalt der CSV ist - da werden als Feldtrennzeichen Kommata benutzt. Mein Script geht von Semikolons aus (Zeile 19). Kommata zu benutzen ist auch ungeschickt, weil das Namensfeld ja bei manchen Datensätzen schon ein Komma enthält. Ändere das Feld-Trennzeichen der CSV auf Semikolon und es sollte funktionieren.
Gruß
Friemler
wenn das
23842,Underdog, Hund,Under@dog.hund
Gruß
Friemler
Hallo!
Naja, warum einfach, wenn's auch umständlich geht
Wünsche auch ein schönes Wochenende
Gruß Dieter
Naja, warum einfach, wenn's auch umständlich geht
Wünsche auch ein schönes Wochenende
Gruß Dieter
Hallo Underdog81!
Naja, sofern es tatsächlich einen Excel-Datei ist, würde ich die *.xls direkt in eine Csv-Datei mit Kommata exportieren. Aber sicherlich hast Du meine diesbezügliche Nachfrage ja einfach übersehen
Gruß Dieter
Naja, sofern es tatsächlich einen Excel-Datei ist, würde ich die *.xls direkt in eine Csv-Datei mit Kommata exportieren. Aber sicherlich hast Du meine diesbezügliche Nachfrage ja einfach übersehen
Gruß Dieter
Hallo Underdog81.
Als erstes solltest du eindeutig klarstellen in welchem Format nun der Inhalt deines Exportfiles kommt, statt die Leute die Hilfe anbieten im Trüben fischen zu lassen. Solange das nicht klar ist kann niemand wissen wie diese Daten sinvoll weiterverarbeitet werden könnten.
Mittels VBScript könnte man dann bspw. auch eine Instanz von Excel erzeugen und auf die VBA Komponente zugreifen, die die Arbeit für dich erledigt. (BTW: mit welcher Officeversion arbeitest du?)
Grüße
rubberman
Als erstes solltest du eindeutig klarstellen in welchem Format nun der Inhalt deines Exportfiles kommt, statt die Leute die Hilfe anbieten im Trüben fischen zu lassen. Solange das nicht klar ist kann niemand wissen wie diese Daten sinvoll weiterverarbeitet werden könnten.
Mittels VBScript könnte man dann bspw. auch eine Instanz von Excel erzeugen und auf die VBA Komponente zugreifen, die die Arbeit für dich erledigt. (BTW: mit welcher Officeversion arbeitest du?)
Grüße
rubberman
Hallo Underdog81!
Na dann versuchs mal damit (*.vbs):
Wobei das erste Tabellenblatt exportiert wird. Eine eventuelle Überschrift in der 1. Zeile ist noch nicht berücksichtigt.
Gruß Dieter
[Edit] Auf Rubbermans Anregung hin, die Konstante ReplaceChar nun auch verwendet [/Edit]
Na dann versuchs mal damit (*.vbs):
Option Explicit
Const strXlsPath = "X:\Test\Test.xls" 'Xls-Pfadangabe anpassen
Const strCsvPath = "X:\Test\Test.csv" 'Csv-Pfadangabe anpassen
Const Delim = "," 'Csv-Trennzeichen
Const ReplaceChar = " " 'Komma im Namen durch Leerzeichen ersetzen?
Dim objFso, objCsvFile, objCells, arrCsvValues, strNamen
Set objFso = CreateObject("Scripting.FileSystemObject")
If Not objFso.FileExists(strXlsPath) Then
MsgBox "Datei '" & strXlsPath & "' nicht gefunden!", vbExclamation, "Fehler...": WScript.Quit
End If
Set objCsvFile = objFso.CreateTextFile(strCsvPath)
With GetObject(strXlsPath)
With .Sheets(1)
For Each objCells In .Range("B:B")
If IsEmpty(objCells) Then Exit For
strNamen = Replace(objCells.Value, ",", ReplaceChar)
arrCsvValues = Array(strNamen, objCells.Offset(0, 1).Value, 1, 1)
objCsvFile.WriteLine Join(arrCsvValues, Delim)
Next
End With
.Close False
End With
objCsvFile.Close
Gruß Dieter
[Edit] Auf Rubbermans Anregung hin, die Konstante ReplaceChar nun auch verwendet [/Edit]
Hallo Rubberman!
Danke für den Hinweis (oben korrigiert).
Wußte doch, dass ich was vergessen hatte
Gruß Dieter
Danke für den Hinweis (oben korrigiert).
Wußte doch, dass ich was vergessen hatte
Gruß Dieter
Hallo Underdog81!
Bei diesem Script können eine oder mehrere Excel-Dateien übergeben werden. Du kannst jetzt also die Dateien auf das Script ziehen und/oder eine Verknüpfung mit dem Script in den SendTo-Ordner legen.
Es wird explizit geprüft, ob es ich um eine *.xls-Datei handelt und zusätzlich extra nochmal, ob die Datei auch existiert (Batch-Aufruf...).
Die Csv-Export-Datei wird im gleichen Pfad, wie die *.xls-Datei mit dem gleichen Dateinamen gespeichert.
Gruß Dieter
Bei diesem Script können eine oder mehrere Excel-Dateien übergeben werden. Du kannst jetzt also die Dateien auf das Script ziehen und/oder eine Verknüpfung mit dem Script in den SendTo-Ordner legen.
Es wird explizit geprüft, ob es ich um eine *.xls-Datei handelt und zusätzlich extra nochmal, ob die Datei auch existiert (Batch-Aufruf...).
Die Csv-Export-Datei wird im gleichen Pfad, wie die *.xls-Datei mit dem gleichen Dateinamen gespeichert.
Option Explicit
Const Delim = "," 'Csv-Trennzeichen (Ausgabe)
Const ReplaceChar = " " 'Komma im Namen durch Leerzeichen ersetzen
Dim objArgs, objArg, objFso, objCsvFile, objCells, arrCsvValues
Dim strNamen, strFilePath, strFileName, strCsvFile
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then MsgBox "Zuwenig Parameter!", vbExclamation, "Fehler...": WScript.Quit
Set objFso = CreateObject("Scripting.FileSystemObject")
For Each objArg In objArgs
If LCase(objFso.GetExtensionName(objArg)) = "xls" Then
strFileName = objFso.GetBaseName(objArg)
strFilePath = objFso.GetParentFolderName(objArg)
strCsvFile = objFso.BuildPath(strFilePath, strFileName & ".csv")
If Not objFso.FileExists(objArg) Then
MsgBox "Datei '" & objArg & "' nicht gefunden!", vbExclamation, "Fehler...": WScript.Quit
End If
Set objCsvFile = objFso.CreateTextFile(strCsvFile)
With GetObject(objArg)
With .Sheets(1)
For Each objCells In .Range("B:B")
If IsEmpty(objCells) Then Exit For
strNamen = Replace(objCells.Value, ",", ReplaceChar)
arrCsvValues = Array(strNamen, objCells.Offset(0, 1).Value, 1, 1)
objCsvFile.WriteLine Join(arrCsvValues, Delim)
Next
End With
.Close False
End With
objCsvFile.Close
End If
Next
Gruß Dieter
Hallo Rubberman!
So'n Mist aber auch, schon wieder was übersehen
Gruß Dieter
So'n Mist aber auch, schon wieder was übersehen
Gruß Dieter
Hallo Underdog,
ich bin jetzt einfach mal so dreist und modifiziere das Script von Dieter, habe gerade etwas Zeit:
Trage die gewünschte Anzahl Zeilen pro Datei in Zeile 5 ein.
Die erzeugten Dateien werden durchnummeriert, z.B.
Gruß
Friemler
ich bin jetzt einfach mal so dreist und modifiziere das Script von Dieter, habe gerade etwas Zeit:
Option Explicit
Const Delim = "," 'Csv-Trennzeichen (Ausgabe)
Const ReplaceChar = " " 'Komma im Namen durch Leerzeichen ersetzen
Const nLines = 250 'Anzahl Zeilen pro erzeugter Datei
Dim objArgs, objArg, objFso, objCsvFile, objCells, arrCsvValues
Dim strNamen, strFilePath, strFileName, strCsvFile, intCntr
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then MsgBox "Zuwenig Parameter!", vbExclamation, "Fehler...": WScript.Quit
Set objFso = CreateObject("Scripting.FileSystemObject")
For Each objArg In objArgs
If LCase(objFso.GetExtensionName(objArg)) = "xls" Then
strFileName = objFso.GetBaseName(objArg)
strFilePath = objFso.GetParentFolderName(objArg)
If Not objFso.FileExists(objArg) Then
MsgBox "Datei '" & objArg & "' nicht gefunden!", vbExclamation, "Fehler...": WScript.Quit
End If
intCntr = 0
With GetObject(objArg)
With .Sheets(1)
For Each objCells In .Range("B:B")
If intCntr Mod nLines = 0 Then
If IsObject(objCsvFile) Then objCsvFile.Close
strCsvFile = objFso.BuildPath(strFilePath, strFileName & CStr(intCntr\nLines + 1) & ".csv")
Set objCsvFile = objFso.CreateTextFile(strCsvFile)
End If
If IsEmpty(objCells) Then Exit For
strNamen = Replace(objCells.Value, ",", ReplaceChar)
arrCsvValues = Array(strNamen, objCells.Offset(0, 1).Value, 1, 1)
objCsvFile.WriteLine Join(arrCsvValues, Delim)
intCntr = intCntr + 1
Next
End With
.Close False
End With
objCsvFile.Close
End If
Next
Trage die gewünschte Anzahl Zeilen pro Datei in Zeile 5 ein.
Die erzeugten Dateien werden durchnummeriert, z.B.
Import1.csv
, Import2.csv
usw.Gruß
Friemler
Hallo Friemler!
Gruß Dieter
ich bin jetzt einfach mal so dreist und modifiziere das Script von Dieter, habe gerade etwas Zeit:
Finde ich gut, bin noch anderweitig beschäftigtGruß Dieter