wir habe einen Report, der csv-Dateien Aufruft und diese verarbeitet. Leider enthält die neue csv-Datei Zeichen, die vorher gelöscht werden müssen. Den Report, der die csv-Datei verarbeitet, möchte ich nicht ändern. Wie kann ich vorgehen? Kann ich einen neuen Report schreiben, der die csv-Datei ändert und anschließend den Report zur Verarbeitung aufruft.
Was sind das denn für Zeichen die gelöscht werden müssen?
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.
Hochkommas (doppelte Anführungszeichen) werden im CSV dazu benutzt um Text zu maskieren, der entweder das Spalten oder Zeilentrennzeichen, beinhaltet. Wenn ein Hochkomma alleine vorkommt, handelt es sich um einen Fehler beim Erstellen des CSV, weil einzelne Hochkommas immer escaped werden müssen: https://stackoverflow.com/questions/178 ... ote-in-csv
Eigentlich sollte jeder bessere CSV Export und Import damit umgehen können. Wenn nicht, ist das ein Fehler der vom Softwarehersteller korrigiert werden muss.
Hier hab ich vor einiger Zeit auch meine Meinung zum Standard CSV Export von SAP hinterlassen und warum der Funktionsbaustein nicht verwendet werden sollte: https://www.abapforum.com/forum/viewtop ... 18&t=25508
Dasselbe gilt übrigens auch für das Gegenstück TEXT_CONVERT_CSV_TO_SAP.
Wo liegt nun dein Problem?
Ist die CSV Datei "fehlerhaft"? --> Der Export muss korrigiert werden.
Lässt sich die Datei nicht importieren? --> Schreib deinen eigenen Import und vergiss den von der SAP.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.
Es gibt da auch noch die Klasse CL_RSDA_CSV_CONVERTER. Die sollte mit den Hochkommas umgehen können: https://www.abapforum.com/forum/viewtopic.php?t=23174
Nur muss dazu, wie gesagt, die CSV auch korrekt aufgebaut sein.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.
Hallo,
ich habe mir vorgenommen, dass die Datei unabhängig von dem anderen Report zuerst geändert wird.
Dazu öffne ich die Datei, lese in eine Internet Tabelle ein und möchte diese in die Datei wieder einlesen.
Jetzt wird die CSV Datei eingelesen, die Zeichen " geändert und dann der Inhalt eingehängt.
OPEN DATASET file FOR UPDATE IN TEXT MODE ENCODING DEFAULT.
DO.
READ DATASET file INTO rec.
IF sy-subrc NE 0.
EXIT.
ENDIF.
APPEND rec.
ENDDO.
DELETE rec INDEX 1.
REPLACE ALL OCCURRENCES OF '"' IN TABLE rec WITH space IN CHARACTER MODE.
LOOP AT rec INTO gt_exec.
TRANSFER gt_exec TO file.
ENDLOOP.
CLOSE DATASET file.
Wie schaffe ich es, dass nur das geänderte in die Datei eingefügt wird?
Das Problem ist, dass du zuerst Lesen und dann Schreiben willst. Der Dateizeiger wird beim Lesen an das Zeilenende gesetzt. Willst du dann gleich darauf Schreiben wird der neue Inhalt hinten darangefügt bzw. überschrieben.
Am einfachsten ist, zuerst die Datei komplett einzulesen (OPEN DATASET ... FOR INPUT ... + READ DATASET), zu löschen (DELETE DATASET ...) und dann neu zu erstellen (OPEN DATASET ... FOR OUTPUT ... + TRANSFER).
Alternativ kann man mit SET DATASET/GET DATASET den Dateizeiger manipulieren um sich das Löschen zu sparen aber das wird dann echt tricky. Vorallem weil man die Zeilenendezeichen (CR und/oder LF) mitberücksichtigen muss und bei unterschiedlichen Zeilenlängen Gefähr läuft etwas ungewollt zu überschreiben.
Und nochmal:
Das doppelte Hochkomma ist KEIN fehlerhaftes Zeichen für CSV, wenn man es korrekt maskiert. Im Gegenteil, man braucht das Zeichen um den Spaltentrenner maskieren zu können. Wenn du es also ungeprüft in allen Zeilen entfernst kann es sein, dass man die CSV Datei nicht mehr korrekt einlesen kann bzw. sich einzelne Zellen/Spalten verschieben.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.