Dynamisches Einlesen einer CSV oder erstellen einer Struktur

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

Dynamisches Einlesen einer CSV oder erstellen einer Struktur

Beitrag von auronsen (ForumUser / 3 / 0 / 0 ) »
Hallo alle zusammen,

Gibt es die Möglichkeit eine CSV Datei Dynamisch einzelesen, ohne vorher irgend einen Typ dafür zu wissen? Habe natürlich schon google benutzt.

Derzeitig benutze ich den Funktionsbaustein

Code: Alles auswählen.

CALL FUNCTION 'GUI_UPLOAD'
weiterhin wurde empfohlen den Funktionsbaustein:

Code: Alles auswählen.

CALL FUNCTION 'TEXT_CONVERT_CSV_TO_SAP'
zu verwenden, wobei ich jedoch bei dem Unterpunkt "Tables" eine Tabelle übergeben muss, wo der Typ schon definiert ist.

Code: Alles auswählen.

        CALL FUNCTION 'TEXT_CONVERT_CSV_TO_SAP'
          EXPORTING
            i_field_seperator    = ','
            i_line_header        = 'X'
            i_tab_raw_data       = lt_rawdata
*           I_FILENAME           = p_file
          TABLES
            i_tab_converted_data = lt_csv
          EXCEPTIONS
            conversion_failed    = 1
            OTHERS               = 2.
        IF sy-subrc <> 0.
          "pv_error = 'X'.
          RETURN.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
Das ist aber nicht das, was ich haben will.


Eine andere Möglichkeit wäre natürlich mit split zu arbeiten, jedoch bekomme ich dann immer nur die letzte Zeile als einzige spalte in der lt_csv2:

Code: Alles auswählen.

data: lt_rawdata       TYPE truxs_t_text_data.
data: lt_csv type TABLE OF char50.
data ls_csv type char50.

data: lt_csv2 type TABLE OF char50.


CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = 'C:...test.txt'
     " filetype                = 'DAT'
      has_field_separator     = 'X'
    TABLES
      data_tab                = lt_csv
    EXCEPTIONS
      file_open_error         = 1.





loop at lt_csv into ls_csv.
  split ls_csv at ',' into TABLE lt_csv2.
endloop.


BREAK-POINT.
Ich hätte bei dem Vorgehen gedacht, das ich ggf. einen Tabellentypen dynamisch generieren kann.
Sprich:
1. erstellen Tabellentyp dynamisch, basierend auf der Anzahl der Columns welche die CSV-file hat
2. appende bei jedem schritt wo "into Table lt_csv2" beschrieben wird, das Value in die Tabelle welches den dynamisch generierten Tabellentypen besitzt

Weiß jedoch gerade nicht wie ich da vorgehen soll.

Hättet ihr Vorschläge?

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


Re: Dynamisches Einlesen einer CSV oder erstellen einer Stru

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Vielleicht hilft das:
Unit605 hat geschrieben:Hat die Datei in der ersten Zeile die Spaltennamen?

Wie ist sind die Spalten getrennt? Tab? Semikolon?

(Angepasstes..) Beispiel fuer eine Textdatei getrennt durch Semikolon mit Spaltenname in der ersten Zeile:
Hier braucht man keine Anzahl der Spalten.

Code: Alles auswählen.

FIELD-SYMBOLS: <upload_tab> TYPE STANDARD TABLE.
 LOOP AT lt_uploadtab INTO ls_uploadtab.
    IF sy-tabix EQ 1.  "Header line
      PERFORM create_dynamic_internal_table USING ls_uploadtab.
      CONTINUE.
    ENDIF.
    CLEAR lt_headerline_fieldname.
    SPLIT ls_uploadtab AT con_semicolon INTO TABLE lt_headerline_fieldname.
**** fill dynamic created table <upload_tab> with contains, line by line
    APPEND INITIAL LINE TO <upload_tab> ASSIGNING <upload_str>.
    LOOP AT lt_headerline_fieldname ASSIGNING <headerline_fieldname>.
      ASSIGN COMPONENT sy-tabix OF STRUCTURE <upload_str> TO <comp>.
      MOVE <headerline_fieldname> TO <comp>.
    ENDLOOP.
  ENDLOOP.
************* FORM CREATE.......
FORM create_dynamic_internal_table USING us_uploadtab.
  DATA: lt_headerline_fieldname TYPE STANDARD TABLE OF string,
            lt_fcat                    TYPE lvc_t_fcat,
            lt_dyn_table            TYPE REF TO data.
  FIELD-SYMBOLS: <headerline_fieldname> TYPE string,
                 <ls_fcat> TYPE LINE OF lvc_t_fcat.
***
  TRANSLATE us_uploadtab TO UPPER CASE.
  SPLIT us_uploadtab AT con_semicolon INTO TABLE lt_headerline_fieldname.
  LOOP AT lt_headerline_fieldname ASSIGNING <headerline_fieldname>.
    APPEND INITIAL LINE TO lt_fcat ASSIGNING <ls_fcat>.
    CONDENSE <headerline_fieldname> NO-GAPS.
    <ls_fcat>-fieldname = <headerline_fieldname>.
    <ls_fcat>-datatype = con_strg.  "Datatype STRING
  ENDLOOP.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_fcat
    IMPORTING
      ep_table        = lt_dyn_table.     
  ASSIGN lt_dyn_table->* TO <upload_tab>.
ENDFORM.


Re: Dynamisches Einlesen einer CSV oder erstellen einer Stru

Beitrag von auronsen (ForumUser / 3 / 0 / 0 ) »
Ah entschuldigt. Die Testdatei sieht wie folgt aus:

b,g,h,t,r,f
a,b,c,d,e,f
1,2,3,4,5,6
b,g,h,t,r,r

sind also durch ein ',' getrennt.

Ich würde gerne eine Möglichkeit haben in der z.b. die Erste zeile der Header ist also mit den Feldnamen

b,g,h,t,r,f

und eine weitere in der es keinen Header gibt, aber das kann ich dann denke ich schnell anpassen.

Ich nehme an, dass LT_Uploadtab einfach eine Tabelle ist, die nur einen String besitzt als Column, also wie in meinem Fall?
Könntest du bitte noch die Data-definition mit dazugeben? Also z.b. <upload_str> wobei ich glaube das das beispielsweise in meinem fall ls_csv wäre.

Danke für die Hilfe!

Re: Dynamisches Einlesen einer CSV oder erstellen einer Stru

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Sorry, aber Du hast es bereits erkannt.

Hier noch ein paar fehlendene bzw. Zusatzinfos:

Code: Alles auswählen.

DATA: lt_uploadtab TYPE TABLE OF string.

*Einlesen der Datei ... 
CALL METHOD cl_gui_frontend_services=>gui_upload
      EXPORTING
        filename      = lv_guisourcefile
        dat_mode      = abap_true
      CHANGING
        data_tab      = lt_uploadtab

und nach dem "FORM create_dynamic_internal_table USING us_uploadtab."

geht es ungefaehr folgendermassen weiter: Alles ziemlich Beispielhaft!!!

Ich lese die Spaltenueberschriften aus der importierten Datei Spalte bei Spalte
und vergleiche diese Ueberschriften mit den Feldnamen der Tabelle ( lv_tabname ).
Bei einer Uebereinstimmung schiebe ich die Daten in die gleichnamigen Felder.

Code: Alles auswählen.

** "BEISPIEL: Struktur/Tabelle in die Du die Daten schieben willst = lv_tabname
   descr_ref_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ). 
    LOOP AT <upload_tab> ASSIGNING <upload_str>.
        APPEND INITIAL LINE TO lt_ztable ASSIGNING <ztable01>.
      LOOP AT descr_ref_type->components ASSIGNING <components_wa>.
        CHECK <components_wa>-name NE 'MANDT'.     "BEISPIEL: Feld Mandt will ich nicht fuellen
        ASSIGN COMPONENT <components_wa>-name OF STRUCTURE <upload_str> TO <comp>.
*        check sy-subrc eq 0.
        CONCATENATE '<ztable>-' <components_wa>-name INTO lv_fieldname.
        ASSIGN (lv_fieldname) TO <fieldname>.  "assign 'KUNDENUMMER' to fieldname
        CASE <components_wa>-name.
          WHEN 'KUNDENNUMMER'.
     ASSIGN COMPONENT 'KUNDENNUMMER' OF STRUCTURE <upload_str> TO <comp>.
            <ztable>-buchungsart = <comp>.
.....
.....
.....
.....
      ENDCASE.
     Endloop.
  Endloop.

Das Ganze ist jetzt etwas verwirrend und ungenau deshalb...Morgen mehr, falls noch Fragen...

Re: Dynamisches Einlesen einer CSV oder erstellen einer Stru

Beitrag von auronsen (ForumUser / 3 / 0 / 0 ) »
Ahh, ich habe das glaube ein wenig falsch beschrieben.

Also es sind vorher keinerlei Daten bekannt. das einzige was ich habe, ist die CSV datei. Es ist auch keine Struktur bekannt!
Ich wollte ggf. eine Dynamische Struktur erstellen, basierend auf der csv datei. Also beispielsweise soll wenn ich die csv-datei einlese der Type
tt_csv_read mit 6 (in meiner csv sind 6, aber soll dynamisch sein, die zahl zu ermitteln ist aber nicht schwer) verschiedenen feldern ( geht auch 6* char 50 oderso) genereiert werden.

Diese will ich am liebsten in eine itab schreiben mit 2 verschiedenen Varianten.

1 Variante:

Lese csv datei und erhalte für jeden Eintrag einen Zelleneintrag in der Itab

b,g,h,t,r,f
a,b,c,d,e,f
1,2,3,4,5,6
b,g,h,t,r,r

hier sollte also nur 3 * 6 itab entstehen

2. Variante

b,g,h,t,r,f
a,b,c,d,e,f
1,2,3,4,5,6
b,g,h,t,r,r

eine itab welche 4*6 groß ist.


Das heißt, das z.B.
Ich lese die Spaltenueberschriften aus der importierten Datei Spalte bei Spalte
und vergleiche diese Ueberschriften mit den Feldnamen der Tabelle ( lv_tabname ).
nicht möglich ist.

Werde mir das morgen auch nochmal genauer angucken. Ist schon ein wenig spät :).

Seite 1 von 1

Vergleichbare Themen

2
Antw.
3020
Views
Dynamisches Native SQL erstellen
von Steffi221185 » 01.08.2006 11:18 • Verfasst in ABAP Objects®
2
Antw.
2214
Views
struktur erstellen
von Gast » 17.08.2005 13:32 • Verfasst in ABAP® für Anfänger
18
Antw.
20346
Views
struktur erstellen
von kostonstyle » 05.08.2008 09:23 • Verfasst in ABAP® für Anfänger
1
Antw.
1569
Views
Generische Struktur(wa) erstellen
von macler » 30.08.2006 09:35 • Verfasst in Basis
2
Antw.
2678
Views
Mit Types eine Struktur erstellen.
von behnm » 15.05.2008 13:35 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 66
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 67

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.

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 4 Tagen von jocoder 2 / 66
Etikettendruck mit SmartForms
vor einer Woche von a-dead-trousers 2 / 67

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Wochen von Lucyalison 1 / 129
Group Items auf einer Filterbar
vor 4 Wochen von Bright4.5 1 / 164