PDA

Vollständige Version anzeigen : Erstellen einer CSV-Datei OHNE Carriage Return nach der letzten Zeile


Nagus
03.05.2011, 19:27
Hallo,

ich komme bei einem Problem nicht weiter. Für einen Kunden muss eine csv-Datei erstellt werden, die ganz strikten Vorgaben entspricht. Jede Abweichung in einer Spalte oder einem Feld führt dazu, dass die Datei von deren System als ganzes abgelehnt wird.

Bisher habe ich solche Aufgaben stets mit DoCmd.TransferText acExportDelim... erledigt.
Da dies nicht ging, bin ich übergegangen die Datei mittels DAO, Linie für Linie zu schreiben, was auch funktioniert.

Beiden Methoden aber ist gemein, dass nach der letzten Zeile ein zusätzlicher Zeilenumbruch eingefügt wird, der nicht sein darf.
Wie kann ich das umgehen?

Hier der Code, der, mit Ausnahme des carriage return, funktioniert.

Dim sOutput As String
Dim rs As DAO.Recordset
Dim sHeader As String
Dim s As String

sOutput = <Pfad und Name der Datei>
Set db = CurrentDb
Set rs = db.OpenRecordset("tblTabelle")
sHeader = "Header1,Header2,Header3"
Open sOutput For Output As #1
Print #1, sHeader
Close #1
Do Until rs.EOF
Open sConfirm For Append As #1
s = rs!Spalte1 & "," & rs!Spalte2 & "," & rs!Spalte3
Print #1, s
rs.MoveNext
Close #1
Loop
rs.Close
Set rs = Nothing

gpswanderer
03.05.2011, 19:39
Hallo,
ich würde die Methode DoCmd.TransferText acExportDelim bevorzugen. Warum ist das nicht gegangen?

Arne Dieckmann
03.05.2011, 19:47
Mönsch Klaus - das steht doch im 1. Beitrag.

zum Thema: Man kann die Print-Metode auch anders einsetzen, sodass man gezwungen ist, CR gezielt mitzugeben. Ich meine, dass das mit ; am Ende der Print-Anweisung geht (s. VBA-Hilfe zu dem Thema).

Beim letzten Datensatz gibt man dann CR nicht mit. Der Code muss also nur feststellen, ob man beim Schreiben der Zeile gerade im letzten Datensatz steht. Das mehrfache Öffnen der Textdatei innerhalb der Schleife muss übrigens auch nicht sein.

gpswanderer
03.05.2011, 19:50
Hallo,
Mönsch Klaus - das steht doch im 1. Beitrag.manchmal lese ich zu schnell und dann bin ich überfordert.:grins:

Arne Dieckmann
03.05.2011, 20:14
Anbei ein Code, der in der letzten Zeile kein CR ans Ende hängt (ich habe ein paar Anpassungen vorgenommen - der Code aus Beitrag #1 ist anscheinend so doch nicht ganz lauffähig - z.B. einmal sOutput und in der Schleife sConfirm ...) :

Dim db As Database
Dim rs As DAO.Recordset

Dim c As Long, i As Long, j As Long
Dim strDateiname As String, s As String, u As String

Set db = CurrentDb
Set rs = db.OpenRecordset("tblTabelle")
strDateiname = "C:\temp\test.txt"

s = "Header1,Header2,Header3"
c = FreeFile

Open (strDateiname) For Output As #c
Print #c, s

j = DCount("*", "tblTabelle")


Do Until rs.EOF
i = i + 1
If i < j Then
u = vbCrLf
Else
u = ""
End If
s = rs!Spalte1 & "," & rs!Spalte2 & "," & rs!Spalte3
Print #c, s & u;
rs.MoveNext
Loop

Close #c
rs.Close
Set rs = Nothing

ebs17
03.05.2011, 20:28
Am zeilenweisen Schreiben ohne Not störe ich mich auch:
Wenn mich ein evtl. vorhandenes letztes Zeichen in einer Textdatei / in einem String stört, kann ich es auch nachträglich entfernen.
Jede Abweichung in einer Spalte oder einem Feld führt dazu, dass die Datei von deren System als ganzes abgelehnt wird.
Welche weiteren Abweichungen können das sein? Ursprünglich sollte man doch die zu exportierende Tabelle/Abfrage in einen standardisierten Zustand bringen.

Ich hätte bei TransferText oder ADORecordset.Getstring das gleiche Vertrauen, dass Vorhandenes korrekt zusammengesetzt wird, als wenn ich mir Zeilen zusammensetze und in die Textdatei schreibe.

Nagus
03.05.2011, 20:55
Hallo,
ich würde die Methode DoCmd.TransferText acExportDelim bevorzugen. Warum ist das nicht gegangen?

Welche weiteren Abweichungen können das sein? Ursprünglich sollte man doch die zu exportierende Tabelle/Abfrage in einen standardisierten Zustand bringen.

Nun, der Output war anders mit der TransferText-Methode. Das Feedback, das ich bekommen habe, zeigte, dass diese Methode an verschiedenen Stellen Leerzeichen in Form von Anführungszeichen einsetzte. Ich konnte es mir nicht erklären, vielleicht lag es auch an dem System, in das der Kunde die Datei dann eingelesen hat. Jedenfalls habe ich - oder besser der Kunde - mit dem zeilenweisen Schreiben das Problem nicht mehr gehabt.

Nagus
03.05.2011, 20:58
Anbei ein Code, der in der letzten Zeile kein CR ans Ende hängt (ich habe ein paar Anpassungen vorgenommen - der Code aus Beitrag #1 ist anscheinend so doch nicht ganz lauffähig - z.B. einmal sOutput und in der Schleife sConfirm ...) :

Dim db As Database
Dim rs As DAO.Recordset

Dim c As Long, i As Long, j As Long
Dim strDateiname As String, s As String, u As String

Set db = CurrentDb
Set rs = db.OpenRecordset("tblTabelle")
strDateiname = "C:\temp\test.txt"

s = "Header1,Header2,Header3"
c = FreeFile

Open (strDateiname) For Output As #c
Print #c, s

j = DCount("*", "tblTabelle")


Do Until rs.EOF
i = i + 1
If i < j Then
u = vbCrLf
Else
u = ""
End If
s = rs!Spalte1 & "," & rs!Spalte2 & "," & rs!Spalte3
Print #c, s & u;
rs.MoveNext
Loop

Close #c
rs.Close
Set rs = Nothing

Danke Arne, das sieht vielversprechend aus. Werde es gleich morgen einbauen und bestätigen lassen, ob es funktioniert.
Ach ja, sConfirm und sOutput ist in meinem Beispiel das gleiche, nur, dass ich beim Kopieren und Umschreiben hier ins Forum nicht sauber genug korrigiert habe ;)

ebs17
03.05.2011, 21:13
Leerzeichen in Form von Anführungszeichen einsetzte
Da habe ich keine wirkliche Vorstellung, was Du meinst.
Die Einstellmöglichkeiten über eine Exportspezifikation sind Dir bekannt?

Nagus
03.05.2011, 21:25
Da habe ich keine wirkliche Vorstellung, was Du meinst.
Die Einstellmöglichkeiten über eine Exportspezifikation sind Dir bekannt?

Der Kunde hat mir einen Screenprint geschickt, in dem das Problem zu erkennen war. Leider kann ich das Bild nicht anfügen, da es interne Informationen beinhaltet. Du musst dir das so vorstellen, dass vor jeder Zeile erst einmal zwei Anführungszeichen stehen (""), dann kommen die einzelnen Datensätze. Wirklich verstanden habe ich es auch nicht, weswegen ich ja die Alternative für den Export gesucht habe.

Die Einstellmöglichkeiten über eine Exportspezifikation sind mir bekannt. Ich hätte es als nächstes probiert, wenn das zeilenweise Schreiben auch versagt hätte.

Ich habe soeben den Code eingebaut und bei mir sieht es perfekt aus. Jetzt kann ich nur hoffen, dass der Kunde dies bestätigt...

ebs17
03.05.2011, 21:41
Du musst dir das so vorstellen, dass vor jeder Zeile erst einmal zwei Anführungszeichen stehen ("")
Da gibt nicht etwa ein erstes leeres Stringfeld?

Nagus
04.05.2011, 13:53
@Eberhard
Nein, ein leeres Stringfeld gab es nicht. Wenn ich die Datei geöffnet habe, gab es keine Probleme, lediglich beim Kunden war es so.

@Arne
nochmal vielen Dank für deinen Code. Habe heute das Ok des Kunden bekommen, dass das Format in Ordnung ist.