stelli
Goto Top

CSV zu TXT automatisiert mit Access

Moin,

hab ein etwas komplizierteres Problem:

Ich habe eine CSV Datei vorliegen mit Kontaktdaten. Hier stehen alle Informationen über bestimmte Mitarbeiter drin, von denen aber nur ein paar benötigt werden. Alle Attribute sind mit Semikolons getrennt. Wenn ich nun Access 2007 öffne und hier auf "öffnen" klicke und die CSV Datei auswähle, muss ich ihm in diesem Assistenten sagen, dass alle Spalten mit Semikolons getrennt sind und Access ordnet mir die Attribute in die richtigen Spalten. Insgesamt sind das 19 Stück. Von diesen 19 Spalten benötige ich aber nur 4 Stück. Also wähle ich nur die 4 Stück aus die ich benötige und fertig. Wenn ich jetzt manuell auf Export klicke und wähle aus, dass er mir diese 4 Spalten in eine txt Datei exportieren soll, kann ich ihm in diesem Export Assistenten sagen, dass ich die verschiedenen Spalten wieder mit Semikolons getrennt haben möchte. Export funktioniert.

Als Beispiel hier mal ein Datensatz aus der CSV:

Nachname;Vorname;Status;Vollständiger Name;E-Mail gesch;Telefon Gesch; Telefon privat;E-Mail Privat;Geschlecht;Geburtsdatum; usw usw usw...

Jetzt wollte ich das ganze automatisch ablaufen lassen...
Hierzu habe ich in Access ein Modul erstellt, das wie folgt aussieht:

Function autoexec()
On Error GoTo autoexec_Err
DoCmd.SetWarnings (Warningsoff)
DoCmd.TransferText acExportDelim, , "Kontakte", "C:\test.txt", True


autoexec_Exit:
Exit Function

autoexec_Err:
MsgBox Error$
Resume autoexec_Exit

End Function

Soweit so gut...
Jetzt habe ich ein Makro gebaut indem die Funktion autoexec ausgeführt wird...
Wenn ich das Makro starte, startet bekomme ich nun folgende Fehlermeldung: "Das Feldtrennzeichen für die angegebene Textdatei entspricht dem Dezimaltrennzeichen oder Texttrennzeichen"

Wenn ich nun meinen oben genannten Code nicht mit Semikolon sondern mit TABS exportieren lasse funktioniert es.. ich benötige aber Semikolons...

Weiß hier jemand Rat??

Vielen Dank

Gruß Stelli

Content-Key: 160573

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

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

Member: bastla
bastla Feb 11, 2011 at 08:53:57 (UTC)
Goto Top
Hallo Stelli!

Du hast also nur vor, aus der CSV eine TXT zu machen, ohne die Daten in Access zu bearbeiten? Falls ja, würde ich ganz einfach VBS dafür verwenden - ungetestet:
CSV = D:\Deine Kontaktdaten.csv"  
TXT = "D:\test.txt"  
Delim = ";"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Satz = Split(fso.OpenTextFile(CSV).ReadAll, vbCrLf) 'zeilenweise in Array einlesen  

Set TXTFile = fso.CreateTextFile(TXT)
For i = 0 To UBound(Satz)
    Feld = Split(Satz(i), Delim)
    TXTFile.WriteLine Feld(0) & Delim & Feld(1) & Delim & Feld(4) & Delim & Feld(5) 'nur benötigte Felder in die Textdatei schreiben  
Next
TXTFile.Close

WScript.Echo Ubound(Satz) + 1 & " Datensätze in """ & TXT & """ geschrieben."  
Grüße
bastla
Member: Stelli
Stelli Feb 11, 2011 at 09:32:09 (UTC)
Goto Top
Hey danke für den Tipp,

habe es gleich mal ausprobiert. Kenne mich aber mit VBS nicht so wirklich aus. Wenn ich es jetzt starte bekommt ich die Fehlermeldung Objekt erforderlich. Eine Txt Datei wird angelegt. Allerdings hier auch mit den falschen Feldern und mit einem Leerschritt zwischen jedem Buchstaben und Zeichen.

Es kommt auch in der CSV vor dass mal ein Feld leer ist.. D.h. dass hier wo normalerweise eine telefonnummer zwischen zwei Semikolons Steht ( ;01711234567;) dann nur ein ;; steht. (wird das dann auch bei der Feldauswahl erkannt?)

CSV = "D:\Kontkate.csv"
TXT = "D:\test.txt"
Delim = ";"
Set fso = CreateObject("Scripting.FileSystemObject")
Satz = Split(fso.OpenTextFile(CSV).ReadAll, vbCrLf) 'zeilenweise in Array einlesen

Set TXTFile = fso.CreateTextFile(TXT)
For i = 0 To UBound(Satz)

Feld = Split(Satz(i), Delim)

TXTFile.WriteLine Feld(1) & Delim & Feld(2) & Delim & Feld(7) & Delim & Feld(9)

Next

TXTFile.Close

WScript.Echo UBound(Satz) + 1 & " Datensätze in """ & TXT & """ geschrieben."
Member: bastla
bastla Feb 11, 2011 at 09:44:32 (UTC)
Goto Top
Hallo Stelli!
mit den falschen Feldern und mit einem Leerschritt zwischen jedem Buchstaben und Zeichen.
"Falsche" Felder erhöltst Du, wenn Du vermutlich nicht die Feldnummer ab 0 gezählt hast /siehe mein Beispiel oben) - mit
Nachname;Vorname;Status;Vollständiger Name;E-Mail gesch;Telefon Gesch; Telefon privat;E-Mail Privat;Geschlecht;Geburtsdatum; usw usw usw...
Nachname2;Vorname2;Status2;Vollständiger Name2;E-Mail gesch2;;;E-Mail Privat2;Geschlecht2;Geburtsdatum2; usw usw usw...
getestet sieht mein Ergebnis auch so aus:
Vorname;Status;E-Mail Privat;Geburtsdatum
Vorname2;Status2;E-Mail Privat2;Geburtsdatum2
Wenn die Leerschritte tatsächlich zwischen allen einzelnen Zeichen auftauchen, könnte ev die CSV im Unicode-Format vorliegen - dann müsstest Du die Zeile 6 (zumindest in meinem Ansatz - bei Dir wird mangels ""-Formatierung ja keine Zeilennummer angezeigt) auf
Satz = Split(fso.OpenTextFile(CSV, 1, False, True).ReadAll, vbCrLf) 'zeilenweise in Array einlesen
ändern.

Wenn dann übrigens auch wieder Unicode geschrieben werden soll, wäre noch die Zeile 8 auf
Set TXTFile = fso.CreateTextFile(TXT, True, True)
anzupassen ...

Grüße
bastla
Member: Stelli
Stelli Feb 11, 2011 at 10:23:16 (UTC)
Goto Top
Vielen Dank funktioniert jetzt einwandfrei....

Hast du zufällig noch eine Lösung wie ich mehrere CSV Dateien einlesen und alles in eine TXT Datei bringen kann?
Member: bastla
bastla Feb 11, 2011 at 14:19:48 (UTC)
Goto Top
Hallo Stelli!

Magst Du noch mehr über diese mehreren CSV-Dateien erzählen (wie etwa, wo/wie sie zu finden wären)?
Es gäbe übrigens eine ganz einfache Methode, alle Dateien eines Ordners mit einem CMD-Befehl zusammenzufassen (um dann stattdessen die Ergebnisdatei weiterzubearbeiten):
type D:\*.csv>D:\AlleKontakte.txt
Voraussetzung wäre hierfür nur, dass die jeweils letzte Zeile mit einer Zeilenschaltung endet.

Grüße
bastla
Member: Stelli
Stelli Feb 11, 2011 at 14:27:14 (UTC)
Goto Top
Also zur Zeit beläuft sich das ganz noch auf 1 CSV Datei die auf einem server liegt.. aber ich weiß schon, dass es demnächst wohl ein paar Dateien mehr geben wird die dann auch auf dem Server liegen werden... Möglich wäre dass sie in unterschiedlichen Ordnern liegen. und bevor ich anfange und alle txt dateien zusammenführen lasse wäre es ja ideal wenn das vbs programm einfach mehrere csv dateien einlesen und anschließend nach dem gleichen verfahren zusammen in eine txt datei schreibt...
Member: bastla
bastla Feb 11, 2011 at 14:37:02 (UTC)
Goto Top
Hallo Stelli!

Wenn Du die Pfade kennst, ist das ja weiter kein Problem:
AlleCSV = Array("D:\Kontkate.csv", "D:\Unterordner\Kontaktdaten2.csv", "D:\Textordner\Kontakt.txt")  
TXT = "D:\test.txt"  
Delim = ";"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set TXTFile = fso.CreateTextFile(TXT)

For Each CSV In AlleCSV
    Satz = Split(fso.OpenTextFile(CSV).ReadAll, vbCrLf) 'zeilenweise in Array einlesen  

    Satzanzahl = Satzanzahl + UBound(Satz) + 1
    For i = 0 To UBound(Satz)
        Feld = Split(Satz(i), Delim)
        TXTFile.WriteLine Feld(1) & Delim & Feld(2) & Delim & Feld(7) & Delim & Feld(9)
    Next
Next

TXTFile.Close

WScript.Echo Satzanzahl & " Datensätze in """ & TXT & """ geschrieben."  
Voraussetzung dafür ist natürlich, dass der Satzaufbau in allen Einzeldateien gleich ist ...

Grüße
bastla