.csv-Datei einlesen macht Probleme bei Anführungszeichen

Getting started ... Alles für einen gelungenen Start.
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

.csv-Datei einlesen macht Probleme bei Anführungszeichen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo!
Ich lese eine durch Komma getrennte .csv-Datei ein und trenne die einzelnen Bestandteile, die ich dann wiederum in eine Struktur einlese.

Code: Alles auswählen.

SPLIT zeile AT trennzeichzen INTO:...
Jetzt habe ich folgendes Problem. Es gibt in der .csv Datei durch Anführungszeichen (") zusammengehörende Textteile, die jedoch Kommas besitzen. Diese Texte möchte ich jedoch nicht trennen, da sie ja zusammen gehören.
Wie könnte ich das denn anstellen?

Grüße

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: .csv-Datei einlesen macht Probleme bei Anführungszeichen

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
hi!

Okay das ist jetzt ein wenig aufwendiger:

Wenn du Basis 7.0 zur Verfügung hast, kanns du dafür Regex hernehmen

Code: Alles auswählen.

data:
  lt_string type stringtab,
  lt_match type match_result_tab.

field-symbols:
  <ld_string> type string,
  <ls_match> type match_result.

* Zuerst mal alle trennzeichzen entfernen die zwischen zwei " stehen
FIND ALL OCCURRENCES OF REGEX '"[^"]*"?' IN zeile RESULTS lt_match.
loop at lt_match assigning <ls_match>.
  REPLACE ALL OCCURRENCES OF trennzeichzen IN zeile+<ls_match>-offset(<ls_match>-length) WITH cl_abap_charutilities=>cr_lf+1.
* Um Speicher zu schonen gleich die Ergebnisse weglöschen
  delete lt_match.
endloop.

SPLIT zeile AT trennzeichzen INTO TABLE lt_string.

*jetzt die trennzeichzen wiederherstellen
LOOP AT lt_string assigning <ld_string>.
  REPLACE ALL OCCURRENCES OF cl_abap_charutilities=>cr_lf+1 IN <ld_string> WITH trennzeichzen.
* Damit die unschönen " auch noch weg sind
  REPLACE ALL OCCURRENCES OF '"' IN <ld_string> WITH space.
ENDLOOP.
Statt cl_abap_charutilities=>cr_lf+1 (HEX 0A) kannst du auch ein anderes bel. nicht druckbares Zeichen zum ersetzten verwenden

Hinweis: die Regex sollte '"[^"]*"?' lauten! Die Code-Anzeige filtert leider die [] heraus
--> Bedeutet: Suche jene Text die mit " beginnen, aus bel. vielen nicht-" bestehen und von einem oder keinem " abgeschlossen sind.

Ohne Regex muss die Ersetzung so ablaufen:

Code: Alles auswählen.

data:
  ld_length type i,
  lt_match type match_result_tab.

field-symbols:
  <ls_match01> type match_result,
  <ls_match02> type match_result.

FIND ALL OCCURRENCES OF '"' IN zeile RESULTS lt_match.
loop at lt_match assigning <ls_match01>.
* Zwei Fundstellen ergeben die Länge des Textes unter "  
  read table lt_match assigning <ls_match02> index 2.
  if sy-subrc eq 0.
    ld_length = <ls_match02>-offset - <ls_match01>-offset.
  else.
    ld_length = strlen( zeile ) - <ls_match01>-offset.
  endif.
  REPLACE ALL OCCURRENCES OF trennzeichzen IN zeile+<ls_match01>-offset(ld_length) WITH cl_abap_charutilities=>cr_lf+1.
* Beide bereits verarbeitete Ergebnisse wieder löschen.
  delete lt_match index 1.
  delete lt_match index 1.
endloop.
lg
ADT
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.

ECC: 6.18
Basis: 7.50

Re: .csv-Datei einlesen macht Probleme bei Anführungszeichen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
@ADT
Wow super, vielen Dank für die Mühe!

Leider habe ich jetzt ein weiteres/neues Problem. Ich habe Felder, die leer sind. Dies wird mir jedoch nicht separiert.
Das sieht dann z.B. so aus (zuvor): abc,def,,,jkl,mno

nach der Trennung:
abc
def
,,jkl
mno

Wie könnte man das lösen?

Grüße

Re: .csv-Datei einlesen macht Probleme bei Anführungszeichen

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Das sollte SPLIT eigentlich berücksichtigen.
Ich hab das Coding auf unserem System gerade ausprobiert und bis auf einige Tippfehler meinerseits :shock: erhalte ich das gewünschte Ergebnis.

Vielleicht hilft dir die Hilfe von SPLIT weiter, dass hier vielleicht aufgrund einer Systemeigenheit (Systemparameter, zugrundeliegendes Betriebssystem, Kernel, ...) mehrere aufeinanderfolgende Trennzeichen ignoriert werden.

Du könntes sonst noch versuchen alle Vorkommen von ',' durch ', ' zu ersetzten, dann die Trennung wie gewohnt mit ',' machen und im Ergebnis alle Zeilen bis auf die Erste um ein Zeichen nach links zu verschieben (SHIFT ... LEFT BY 1 PLACES).

lg ADT
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.

ECC: 6.18
Basis: 7.50

Re: .csv-Datei einlesen macht Probleme bei Anführungszeichen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Ja, hast recht. Zuhause mal am eigenen System getestet und da gehts. :o
Auf jeden Fall vielen Dank für die Hilfe!

Viele Grüße

Seite 1 von 1

Vergleichbare Themen

0
Antw.
3957
Views
xml Datei einlesen
von Rabea1103 » 05.03.2009 13:58 • Verfasst in ABAP® Core
4
Antw.
2483
Views
Datei Paketweise einlesen?
von killa12 » 12.10.2010 12:03 • Verfasst in ABAP® Core
2
Antw.
4011
Views
XML Datei in ABAP einlesen
von Zubasa » 31.03.2011 10:53 • Verfasst in ABAP Objects®
19
Antw.
14246
Views
Excel-Datei einlesen
von Zubasa » 01.10.2010 14:16 • Verfasst in ABAP Objects®
1
Antw.
8761
Views
Excel Datei einlesen
von kostonstyle » 11.12.2006 11:26 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 18 Stunden von Bright4.5 1 / 409
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2055
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8652