CSV: Schreiben im Binarymode, Lesen im Textmode?

LMDaniel999

Level-1
Beiträge
57
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe ein Problem beim Ex- und Importieren von CSV Dateien. Steuerung ist eine Beckhoff mit TwinCat 2.11.

Ich habe eine Tabelle mit 100 Zeilen und 163 Spalten, die Im- und Exportiert werden soll.
Eigentlich hab ich alle Exporte im Textmode mit den Beispielen von Beckhoff gemacht.
Klappt auch gut. Nur ist die o.g. Tabelle zu groß. Ich kann im Textmode nur 253 Zeichen pro Zeile schreiben. Ich brauche ca. 800.
Also hab ich den Export im Binarymode gemacht und exportiere Strings. Das klappt dann.

"Problem" ist allerdings, dass der Binarymode alle Strings mit Anführungszeichen umklammert.
So kann ich die Datei nicht im Textmode lesen, weil dann Anführungszeichen da sind.
Abhilfe würde der Binarymode zum lesen machen. Aber wenn ich die Datei einmal in Excel offen hatte, entfernt mir das in jeder Zelle die Anführungszeichen.
Dann könnte ich es nicht mehr im Binarymode lesen.

Das Einfachste wäre, wenn ich im Binarymode schreiben kann, er mir aber die Anführungszeichen nicht um die Strings packt.
Hat das schonmal jemand gemacht?
Oder kann ich im Textmode mehr Zeichen schreiben, durch Umcoden?

Danke!
 
Auch im Textmode müssen mehr Zeichen je Zeile gehen.
Warum kannst Du nur 253 Zeichen schreiben? Wie schreibst Du in die Datei?
Benutzt Du vielleicht STRINGs zum Zusammenstellen der Ausgabezeile? Versuche auf BYTE/CHAR-Array umzustellen oder schreibe eine Ausgabezeile in mehreren Schreibaufträgen, die Zeilenschaltung dann erst im letzten.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi.
Ich nutze das Beispiel von Beckhoff:
hier

Dort steht, dass nr 253 Zeichen gehen.
Die Daten werden alle in einen String gepackt, der 255 Zeichen lang ist.
Das CLRF Zeichen benötigt 2 Zeichen, weswegen nur 253 übrig bleiben.
Ich habe schon versucht, den String zu verlängern. Geht nicht.

Kann ich hier einfach einen anderen Typ nutzen?
Ist ein Char Array mit einem String kompatibel?

Danke
 
Hallo,
dein Problem wird nicht das Schreiben sein sondern das Einlesen.
Du mußt ja beim Schreiben nicht erst alles in einen String packen und den dann wegschreiben sondern du kannst hier mit mehreren (kleineren) Teil-Strings arbeiten und die der Reihe nach wegschreiben. Am Ende der Zeile (also mit dem letzten String) schreibst du dann dein CRLF.
Schon könntest du im Textmode weit mehr als 255 Zeichen schreiben.

Nun aber das Ein-(Rück-) Lesen : Hier liest du dann ja erstmal die Zeile ein - und die dann dummerweise in einen String. An dieser Stelle greift dann m.E. dein 255 Zeichen-Problem wenn die Zeile viel länger ist ...

Gruß
Larry
 
Hi.
Das mit dem Lesen ist ein guter Hinweis. Danke.
Aber das hatte problemlos funktioniert. Ich konnte die Daten, die ich mit dem Binarymode geschrieben habe, im Textmode lesen.
Problem ist halt nur, dass nur die Strings angezeigt werden und dann auch noch mit Anführungszeichen.
Die Zahlen bleiben bei 0, da vermute ich liegt es am Konvertieren. Ich hab ja STRING_TO_INT und STRING_TO_REAL da drin.
Denke dass die spinnen, wenn da Anführungszeichen bei sind.
Sollte ich aber vielleicht mal testen.......

Kann ich im Textmode das Schreiben einfach mehrmals wiederholen und nur beim letzten dann das CRLF machen? Geht das einfach so?
Also einfach nach X Zeichen aufhören, schreiben, weitermachen, schreiben, usw?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi nochmal!

Ich habe eine Lösung gefunden!!!

Nach dem Testen vom Lesen der langen Datei im Textmode hab ich herausgefunden, dass er zwar die ganze Zeile mit mehr wie 255 Zeichen liest, jedoch einzelne Zeichen in der gelesenen Datei fehlen. Ich vermute, dass das vom mehrfachen Lesen der Daten kommt.

Geschrieben habe ich die Daten im Binary-Mode, wobei ich ja ursprünglich das Problem mit den Anführungszeichen in jeder Zeile hatte!
Das habe ich wegbekommen. Es ist also möglich mit dem Binary-Mode Daten ohne die Anführungszeichen zu schreiben.

Zur Info: Laut Beckhoff braucht man für den Binarymode eine spezielle Software zum Öffnen der CSV Datei. Welche weiß ich zwar immer noch nicht, aber hier geht es wohl nur um manche Datentypen. Wenn man einen String per Binarymode schreibt, kann man ihn mit dem Notepad oder Excel lesen.
Ich habe also alle meine Daten in Strings konvertiert und in eine temporäre Datenbank geschrieben.

Daraus lese ich die Daten nun als String.
Nimmt man das Beckhoff Beispiel zur Hand, verwenden die in dem Beispiel den Baustein FB_CSVMemBufferWriter.
Dieser Baustein bekommt im Beispiel über eine Adresse und eine Länge die zu Schreibenden Daten übergeben.
Dadurch fügt er den Daten die Anführungszeichen hinzu.
Dies macht er jedoch NICHT, wenn man dem Baustein einen String über putValue übergibt.

Möchte man also so wie ich, nur Strings im BinaryMode schreiben, dann kann man dem Baustein direkt einen String übergeben.
Dadurch entfallen die Anführungszeichen! Das macht das ganze natürlich wesentlich einfacher.

Zusammengefasst muss man sich bei mehr wie 255 Zeichen also nicht mit dem mehrmaligen Schreiben pro Zeile auseinandersetzen, sondern kann den BinaryMode verwenden.
Man muss nur die Übergabe der Variablen an den FB ändern!
 
Zurück
Oben