underdog81
Goto Top

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

Content-Key: 169781

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

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: 64748
64748 14.07.2011 um 20:58:49 Uhr
Goto Top
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
Mitglied: Underdog81
Underdog81 14.07.2011 um 21:10:48 Uhr
Goto Top
Also geht es mit Batch eh nicht?
Das Komma in Spalte2 ist durch dem Export aus dem ursprünglichen Programm ja leider da.
Es sind ja nicht nur 10 - 50 Adressen, es handelt sich um über 2000 Adressen die zum Teil ein Komma in spalte2 haben.
Und die Trennung durch das Komma in der csv ist ein Muss zum Import.
Irgendwie muss man es doch hinbekommen, das ich schnell zu der gewünschten csv kommen.

Thx Underdog81
Mitglied: 64748
64748 14.07.2011 um 21:17:25 Uhr
Goto Top
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
Mitglied: Friemler
Friemler 14.07.2011 um 21:30:41 Uhr
Goto Top
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
Mitglied: rubberman
rubberman 14.07.2011 um 21:31:33 Uhr
Goto Top
Hallo Zusammen.

Zitat von @Underdog81:
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
Mitglied: Underdog81
Underdog81 14.07.2011 um 21:42:45 Uhr
Goto Top
Wow jetzt wird schnell Kit den antworten.
Also das namenfeld soll den vor und Zuname haben und in der csv in einer Zelle.
Es gibt auch keine Sonderzeichen wie & sondern nur das , Zeichen.
Ich will auch nicht alles selber machen, da ich diesen Vorgang wohl 1-3 mal im Monat machen muss.

Ich geh mal eben Pizza holen und schau dann wieder rein.
Mitglied: Skyemugen
Skyemugen 14.07.2011 um 22:01:09 Uhr
Goto Top
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é
Mitglied: Friemler
Friemler 14.07.2011 um 22:17:15 Uhr
Goto Top
Hallo Underdog,

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
Mitglied: Underdog81
Underdog81 14.07.2011 um 22:24:11 Uhr
Goto Top
Zitat von @Skyemugen:
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é

Ich werde morgen mal versuchen genauer zu erklären wieso ich an Batch gedacht habe.
Auch werde ich einige Beispiele schreiben wie es nach dem Export aussieht und für den Import in das andere Programm sein muss. Auch werde ich prüfen ob es eine "echte" Exel Datei ist und ob man die Daten auch als txt exportieren kann.
Wünsche euch also jetzt eine gute Nacht
Mitglied: Underdog81
Underdog81 14.07.2011 um 22:29:32 Uhr
Goto Top
Cool friemler ich werde es morgen früh sofort testen und schreiben ob es klappt.
Ich muss jetzt zu meiner besseren Hälfte ins Bett.
Ich kann nur sagen, dass ihr mir schon sehr geholfen habt ruhig zu schlafen.
Aber wie lerne ich so etwas oder wo??
Mitglied: Underdog81
Underdog81 15.07.2011 um 09:48:07 Uhr
Goto Top
Guten Morgen

Habe also erst mal die .csv erstellt un der Aufbau sieht so aus.
Adressnummer,Name,E-Mail
23842,Underdog Hund,Under@dog.hund

bei einigen ist eben die Besonderheit mit dem Komma im Feld Name.
Im Beispiel ist im Feld Name -> Underdog, Hund

23842,Underdog, Hund,Under@dog.hund

Ich hab das Script jetzt mal getestet und bekomme einen Fehler.
Windows Scrip Host meldet

Skript: C:\Ordner\ConvertExport.vbs
Zeile: 22
Zeichen: 5
Fehler: Index ausserhalb des gültigen Bereichs: [number: 1]
code: 800A0009
Quelle: Laufzeitfehler in Microsoft VBSkript

Was mach ich falsch oder was passt nicht?
Mitglied: 76109
76109 15.07.2011 um 10:50:41 Uhr
Goto Top
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
Mitglied: cse
cse 15.07.2011 um 11:17:36 Uhr
Goto Top
Hi,

also für sawas bietet sich doch die excelfunktion VERKETTEN an.

=Verketten(saplte1;",";Spalte2;",";" 1, 1")

oder hab ich da was net verstanden?

grüße!
Mitglied: Friemler
Friemler 15.07.2011 um 23:51:57 Uhr
Goto Top
Hallo Underdog,

wenn das
23842,Underdog, Hund,Under@dog.hund
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
Mitglied: Skyemugen
Skyemugen 16.07.2011 um 09:31:25 Uhr
Goto Top
Aloha Friemler,

er hat doch von vornherein gesagt, dass er Kommata benötigt (bzw. das Endprogramm).

greetz André
Mitglied: Friemler
Friemler 16.07.2011 um 10:54:27 Uhr
Goto Top
Moin André,

mein Script erzeugt ja auch eine Datei, die Kommata als Trennzeichen enthält. Die Eingabedatei muss aber Semikolons als Trennzeichen enthalten.

Gruß
Friemler
Mitglied: Underdog81
Underdog81 16.07.2011 um 13:20:49 Uhr
Goto Top
Ahh ok dann hab ich es jetzt gerafft. Dann erstelle ich jetzt eine csv die als trennzeichen ein Simikolon enthält und Teste es nochmal.
Ich werde es aber erst am Montag testen da ich auf meinem IPad von zuhause schlecht arbeiten kann. Die Verbindung ist halt nur eine 20kbit und das schockt nicht über Remote.
Daumen hoch an euch beide Skyemugen und friemler, denn ihr hab sofort verstanden was mein Ziel war.
Danke und schönes Woxhenende.

P.S. Wenn ich aber zu komme werde ich es auch schon am Wochenende testen.
Mitglied: 76109
76109 16.07.2011 um 14:49:05 Uhr
Goto Top
Hallo!

Naja, warum einfach, wenn's auch umständlich gehtface-wink

Wünsche auch ein schönes Wochenende

Gruß Dieter
Mitglied: Underdog81
Underdog81 16.07.2011 um 16:11:08 Uhr
Goto Top
Zitat von @76109:
Hallo!

Naja, warum einfach, wenn's auch umständlich gehtface-wink

Wünsche auch ein schönes Wochenende

Gruß Dieter



Was würdest du denn anders machen oder was ist jetzt in deinen Augen umständlich??
Mitglied: 76109
76109 16.07.2011 um 17:13:18 Uhr
Goto Top
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 übersehenface-wink

Gruß Dieter
Mitglied: rubberman
rubberman 16.07.2011 um 17:19:11 Uhr
Goto Top
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
Mitglied: Underdog81
Underdog81 16.07.2011 um 17:26:21 Uhr
Goto Top
@ didi
Ich habe doch geschrieben, dass in dem Feld mit dem Namen zum Teil ein Komma als trennet steht.
Doch bei dem Programm wie es dann importiert werden soll ein Komma notwendig ist und somit der zweite Teil des Name im Feld für die Email importiert werden soll und somit ein Fehler kommt.

@rubbermann
Ja es ist tatsächlich eine echte Exel Datei und zeigt beim öffnen mit dem Editor tolle lustige Zeichen.
Mitglied: 76109
76109 16.07.2011 um 17:33:27 Uhr
Goto Top
Hallo Underdog81!

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
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 verwendetface-wink [/Edit]
Mitglied: rubberman
rubberman 16.07.2011 um 18:06:15 Uhr
Goto Top
Hallo Dieter!

Bis auf dass du die Konstante ReplaceChar gar nicht verwendest, hätte ich's nicht besser hinbekommen.

Grüße
rubberman
Mitglied: 76109
76109 16.07.2011 um 18:40:46 Uhr
Goto Top
Hallo Rubberman!

Danke für den Hinweis (oben korrigiert).

Wußte doch, dass ich was vergessen hatteface-wink

Gruß Dieter
Mitglied: Underdog81
Underdog81 16.07.2011 um 19:03:23 Uhr
Goto Top
Oh man wo lernt man sowas? Ich verstehe nur bis Zeile 9 was da steht aber den Rest nicht.
Abgesehen davon ziehe ich die Exel oder die csv auf d Script ? Oder soll die csv mit " als trennzeichen stehen in der csv
Ich werde am Montag mal einen Teil der Exel posten, die ich als Export bekomme.
Mitglied: 76109
76109 16.07.2011 um 20:15:37 Uhr
Goto Top
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.

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
Mitglied: rubberman
rubberman 16.07.2011 um 20:25:17 Uhr
Goto Top
Hallo Dieter!

Ich will ja kein Korinthenkacker sein, aber ...
            strNamen = Replace(objCells.Value, ",", ReplaceChar")
... Anführungszeichen hinter ReplaceChar zu viel face-wink
Flüchtigkeitsfehler, wie sie mich schon zum Haareraufen gebracht haben.

Grüße
rubberman
Mitglied: 76109
76109 16.07.2011 um 20:29:10 Uhr
Goto Top
Hallo Rubberman!

So'n Mist aber auch, schon wieder was übersehenface-wink

Gruß Dieter
Mitglied: Underdog81
Underdog81 22.07.2011 um 14:05:05 Uhr
Goto Top
Leute das Script funktionier übrigends echt klasse und perfekt.
Kann man jetzt zusätzlich noch sagen, dass er mehrere Dateien mit beispielsweise 250 Zeilen erstellt?
Wenn nicht ist es nicht so wild.

DANKE AN ALLE DIE HIER GEHOLFEN HABEN!!!!!
Mitglied: Friemler
Friemler 22.07.2011 um 14:57:10 Uhr
Goto Top
Hallo Underdog,

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
Mitglied: 76109
76109 22.07.2011 um 15:40:21 Uhr
Goto Top
Hallo Friemler!

ich bin jetzt einfach mal so dreist und modifiziere das Script von Dieter, habe gerade etwas Zeit:
Finde ich gut, bin noch anderweitig beschäftigtface-smile

Gruß Dieter
Mitglied: Underdog81
Underdog81 22.07.2011 um 15:45:16 Uhr
Goto Top
THX ich weiss nicht was ich sagen soll!!
WO IST DER DANKE BUTTON???