beliebige csv-Datei einlesen - dynamische workarea

Getting started ... Alles für einen gelungenen Start.
21 Beiträge • Seite 1 von 2 (current) Nächste
21 Beiträge Seite 1 von 2 (current) Nächste

beliebige csv-Datei einlesen - dynamische workarea

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hallo Leute,

es wurde ja schon viel zum Thema Dateien einlesen geschrieben, aber leider kann ich für mein Problem noch keine Lösung finden.

Ich möchte csv-Dateien einlesen, kann aber erst zur Laufzeit feststellen wieviele Spalten enthalten sind.

Momentan schreibe ich die Zeilen mittels GUI_UPLOAD in eine erste Tabelle. Im nächstem Schritt würde ich die Zeilen am Trennzeichen splitten un in eine passende Workarea schreiben.

Hier sind wir bei der Frage:
Wie kann ich eine dynamische Workarea aufbauen?
Die Komponentenanzahl der Workarea ergibt sich ja erst aus der Spaltenzahl der csv-Datei. Es muss also zur Laufzeit generiert werden.

Viele Grüße
Michael

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


Beitrag von donny (Specialist / 253 / 0 / 2 ) »
Hi Michael,

nimm als Ziel einfach eine Tabelle deren Zeile nur einen String hat.
Mit SPLIT INTO TABLE wird dann der Inhalt einer Input-Zeile in die Zeilen der Tabelle eingestellt (soviele wie kommen).

Mit DESCRIBE TABLE LINES kannst du dann schauen, wieviele Felder aufgesplittet wurden.

Falls du dynamisch eine Tabelle oder Workarea zur Laufzeit generieren willst, kannst du mal im Forum nach DYNAMISCH und TABELLE suchen, da findest du einiges.

Gruß
donny

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Tach.

Welches Release? Unter Netweaver 7.0 und höher hilft Dir CL_ABAP_STRUCTDESCR=>CREATE.

Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

Ich nehme als Tabelle bzw. Tabellenzeile für den GUI_UPLOAD eine DDIC-Struktur vom Typ String und fester Länger 256.

Da kann man schon mal nachsehen, was man sich da hochgeladen hat.

Die "Entfuselung" mit vorgegebener und ggf. "handgestrickter" Struktur ist bei mir auch immer noch schief gegangen.

Ich nutze die Möglichkeit des SPLIT-Befehls, eine Rohdatenzeile in eine Tabelle zu "trennen". Jede Tabellenzeile dieser Trenntabelle ist diesmal ein "unbegrenzter" STRING und entspricht einer Spalte.

Die ganze Rohdatentabelle abLOOPen und jede Zeile Splitten ...

Code: Alles auswählen.

 split I_BDATARAW at I_SEPARATOR into table LT.
Und dann kann ich ganz bequem die Spalten 1 bis N verarbeiten.

Code: Alles auswählen.

read Table LT assigning <lt> index 1 (oder 2 oder 3 oder ... oder).
In <lt> habe ich den Wert der nummerierten Spalte der gerade laufenden Zeile.

Das gute daran ist, noch bevor die Daten in ein definiertes Feld "gemoved" werden, kann ich schon mal prüfen, was da überhaupt drin steht, denn SPLIT ... AT ... INTO A B C D fliegt raus, wenn der Inhalt auf ein "unverträgliches" Feld triff (z.B. Buchstaben auf ein Fließkommafeld etc.)

Manchmal enthält die 1. Zeile einen Hinweis auf oder die Überschrift für den Spalteninhalt der nachfolgenden Zeilen, aber als Zeichenkette ...

Im letzten Projekt sollten 8 verschiedene Excel/CSV-Schnittstellen zur Buchung nach FI/C'O realisiert werden.

8 mal das gleiche, nur ein bisschen anders. Und dann eine Änderung im Konzept ...!

Ich habe einen Buchungspool daraus gemacht, der sich um Upload, Löschen Quelldatein, Posten-Split, Plausibilität, Buchung , Fehlerbehandlung (BALM, Anwendugnslog), Storno und Wiedervorlage kümmert.

Die "Entfulesung" nimmt für jede "Schnittstelle" eine zu redefinierte Methode vor. Das Ganze ist pro Schnittstelle customizbar.

Die zentrale Struktur enthält alle jemals benötigten Felder. Diese werden fallweise vom "Entfulseler" gefüllt und vom individuellen "Poster" an die FI-BAPIS weitergereicht.

Mittlerweile sind es schon 10 Schnittstellen ...

Gruß
babap

P.S. Das Ding ist Recyclingfähing und überall einsetzbar, wo es um Buchungen aus Excel/CSV nach SAP geht. Mit minimalen Anpassungen hat man ruck zuck jeden CSV-Import fertig!

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hi zusammen,

leider wird in den anderen Beiträgen zum Thema immer wieder auf Tabellen des DDIC bezug genommen. Das entspricht nicht meinem Problem.
Das einlesen, Splitten und Auszählen der Spalten bekomme ich hin.

Die Frage ist wie man dann zur Laufzeit eine beliebige Workarea erstellen kann?

Ich stelle mir das in etwa so vor:

Code: Alles auswählen.

i = 1
BEGIN OF zeile_typ
   DO anzahl_spalten    
      i TYPE string
      i = i + 1
   ENDDO
END OF zeile02_typ
(Den Code bitte nicht zu ernst nehmen, ich will damit nur mein Problem besser aufzeigen. :oops: )

Die Workarea soll also so viele Felder bekommen wie die Anzahl der Spalten ist.
Die Felder sollen 1, 2, 3, ... n heißen.

Ziel ist es den Inhalt der Datei genauso wie er ist in eine interne Tabelle zu schreiben. Die Lösung von babab stellt das nicht dar.

Mein Release ist 46D.
Ich komm damit einfach nicht weiter...

Viele Grüße
Michael

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Hallo Michael,

suche hier im Forum mal nach LVC_TABLE_CREATE.

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Hatte ich vergessen. Wenn du die Tabelle hast, kannst du so eine Strutkur daraus ableiten.

Code: Alles auswählen.

    DATA: dyn_line                  TYPE REF TO data.
    FIELD-SYMBOLS: <ls_data>        TYPE ANY.

*   Arbeitsbereich generieren
    CREATE DATA dyn_line LIKE LINE OF DEINE_TABELLE.
    ASSIGN dyn_line->* TO <ls_data>.


Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hi uh,

leider hab ich die Tabelle ja nicht.
LIKE LINE OF wird also nix.

Der Inhalt der csv_Datei wird mittels GUI_UPLOAD in eine interne Tabelle geschrieben die Zeilenweise dann den Inhalt der Datei enthält.
Die itab hat nur eine Spalte vom TYPE String.
Um die Spalten der csv-Datei zu erkennen enthalten die Zeilen der internen Tabelle ein Trennzeichen. In meinem Fall ist es ';'.

Werd jetzt mal nach LVC_TABLE_CREATE suchen.
Danke für den Tipp.

Viele Grüße

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
LVC_TABLE_CREATE scheint die Lösung zu werden. :lol:

Leider bekomme ich beim Aufruf einen Abap-Laufzeitfehler. :roll:

Code: Alles auswählen.

* Feldkatalog aufbauen
  DO anzahl_spalten TIMES.
    la_fieldcatalog-fieldname = i.
    la_fieldcatalog-inttype = 'c'.
    la_fieldcatalog-intlen = '32000'.
    APPEND la_fieldcatalog TO lt_fieldcatalog.
    i = i + 1.
  ENDDO.

* Erzeugen der dynamischen internen Tabelle
  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = lt_fieldcatalog
   IMPORTING
     ep_table        = it_externtab.

  ASSIGN it_externtab->* TO <externtab>.
Der Laufzeitfehler kommt wärend der CALL METHOD Anweisung.
LOAD_PROGRAMM_NOT_FOUND
Programm " " nicht gefunden.
...
das Programm " " ist nicht in der Bibliothek.

Im Debugger komm ich dann zum FB_TABLE_CREATE der das Programm l_form in l_name aufrufen möchte.

Code: Alles auswählen.

perform (l_form) in program (l_name) using r_oo_class.
l_name enthält aber nur Leerzeichen...

Hat dazu jemand einen Tipp?

Viele Grüße
Michael

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Ohne genau zu wissen ob das ein Grund ist aber dein FIELDNAME im Feldkatalog kam mir sofort "spanisch" vor (1, 2, 3...).

Die Hilfe meint dann auch folgendes dazu:
Der Name muss mit einem Buchstaben beginnen. Nur außerhalb von ABAP Objects kann der Name auch mit einem anderen Zeichen beginnen.

Da du eine statische Methode aufrufst, sollten deine Feldnamen mit einem Buchstaben beginnen.

Re: beliebige csv-Datei einlesen - dynamische workarea

Beitrag von ewx (Top Expert / 4846 / 311 / 642 ) »
pohlmann-schwarza hat geschrieben:Momentan schreibe ich die Zeilen mittels GUI_UPLOAD in eine erste Tabelle. Im nächstem Schritt würde ich die Zeilen am Trennzeichen splitten un in eine passende Workarea schreiben.

Hier sind wir bei der Frage:
Wie kann ich eine dynamische Workarea aufbauen?
Die Komponentenanzahl der Workarea ergibt sich ja erst aus der Spaltenzahl der csv-Datei. Es muss also zur Laufzeit generiert werden.
Wozu willst du denn die Struktur dynamisch erzeugen? Was machst du denn mit den Daten, wenn sie in der dyn. erzeugten Struktur sind?
Hast du dir schon mal den Befehl SPLIT... INTO TABLE angeschaut??
Da hast du dann deine dyn. Workarea - nur eben nicht horizontal ausgerichtet... :)

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hallo zusammen,

hab jetzt meine Feldnamen verbessert indem ich ein 'e' davor schreibe.
Sie lauten jetzt also e1, e2, e3....

Code: Alles auswählen.

* Feldkatalog aufbauen
  DO anzahl_spalten TIMES.
    itxt = i.
    CONCATENATE 'e' itxt INTO name.
    CONDENSE name NO-GAPS.
    la_fieldcatalog-fieldname = name.
    la_fieldcatalog-inttype = 'c'.
    la_fieldcatalog-intlen = '32000'.
    APPEND la_fieldcatalog TO lt_fieldcatalog.
    i = i + 1.
  ENDDO.

* Erzeugen der dynamischen internen Tabelle
  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = lt_fieldcatalog
   IMPORTING
     ep_table        = it_externtab.

  ASSIGN it_externtab->* TO <externtab>.
Der Laufzeitfehler kommt allerdings noch genau wie beschrieben. :cry:
Muss ich vielleicht noch mehr angaben in den Feldkatalog machen?

Hintergrund:
Ich möchte die Daten der csv-Datei später mit dem Inhalt einer Datenbanktabelle abgleichen können. Dabei beinhaltet die csv-Datei, Daten die nicht in der Datenbanktabelle enthalten sind. Diese sollen ermittelt werden und in einer ergänzenden Datenbanktabelle abgelegt werden.

Da sich eine Zeile der Datenbanktabelle genau mit einer Zeile der csv-Datei vergleichen lässt, dachte ich es wäre am bequemsten die csv-Datei auch Zeilenweise in einer internen Tabelle zu haben und dann mittels Index und Feldnamen die Vergleiche aufzubauen.

Sicherlich geht das auch wenn alle Felder untereinander stehen, würde es aber doch ganz gerne mit der dynamischen Tabelle versuchen.

Viele Grüße
Michael

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

für das, was Du da beschrieben hast, brauchst Du keine dynamische Tabelle.

Wenn Du eine interne Tabelle analog der Datenbanktabelle definierst und dann aus den Spalten der CSV-Zeile die Inhalte in die korrespondierenden Felder umfüllst (Spalte 1 nach Feld 4, Spalte 2 nach Feld 1, Spalte 3 nach Feld 7 usw.), dann hast Du die fehlenden Zeilen für die Datenbanktabelle.

Dann kannst Du über die neu zusammengestellte Tabelle loopen, nachsehen, ob der entsprechende Satz auf der Datenbank ist, ihn einfügen, oder schauen, ob die Felder gleich sind oder nicht ...

Gruß
babap

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hi babap,

so langsam sehe ichs ein!
Brauch wohl wirklich keine dynamische interne Tabelle.
Hatte mich da en bisschen festgefahren.

Danke euch für die Tipps.

Viele Grüße
Michael

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

dazu sind ja ein paar Diskussionen und Erfahrungen gut. Da bekommt man Anregungen für die eigene Arbeit. Geht mir genauso.

Und so was ähnliches wie das da oben, mache ich seit ca. einem 3/4 Jahr permanent.

(z.b. der Algorithmus oben entstammt orignial meinem Upload für verantwortliche Mitarbeiter in PS-Projekten ...)

Gruß
babap

Vergleichbare Themen

1
Antw.
1671
Views
Einfache Workarea in komplexe Workarea kopieren
von dawns » 04.07.2007 14:11 • Verfasst in ABAP® für Anfänger
0
Antw.
3959
Views
xml Datei einlesen
von Rabea1103 » 05.03.2009 13:58 • Verfasst in ABAP® Core
1
Antw.
8765
Views
Excel Datei einlesen
von kostonstyle » 11.12.2006 11:26 • Verfasst in ABAP® für Anfänger
0
Antw.
1298
Views
XML-Datei in Kundenauftrag einlesen
von Lori » 02.02.2021 07:14 • Verfasst in Sales and Distribution
19
Antw.
14259
Views
Excel-Datei einlesen
von Zubasa » 01.10.2010 14:16 • Verfasst in ABAP Objects®

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 3 Tagen von Bright4.5 1 / 775
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2395
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8982