Import einer CSV-Datei mit Nachkommazahlen

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

Import einer CSV-Datei mit Nachkommazahlen

Beitrag von cgreiner (ForumUser / 17 / 2 / 0 ) » 5. Dez 2018 16:53

Wie kann elegant eine CSV-Datei importiert werden, wobei auch Nachkommazahlen enthalten sind, die dann der weiteren Verarbeitung als Zahl verwendet werden kann?
auch Negativ-Werte wie -12345678

Beispiel mit Kopfzeile:
LFDNR STKL AF F ZKF AJAHR ALTER1 RE4 VBEZ LZZ KRV KVZ PKPV PKV PVS PVZ R LZZFREIB LZZHINZU VJAHR VBEZM VBEZS ZMVB JRE4 JVBEZ JFREIB JHINZU JRE4ENT SONSTB STERBE VBS SONSTENT VKAPA VMT ENTSCH
17 4 1 0,684 8,5 0 0 750183 0 2 0 0 7368 2 0 0 1 0 0 2005 0 0 12 9002198 0 0 0 4342725 138933 0 0 0 2201691 0 804053
17 4 1 0,684 8,5 0 0 750183 0 2 0 0 7368 2 0 0 1 0 0 2005 0 0 12 9002198 0 0 0 4342725 138933 0 0 0 2201691 0 804053

Danke für Tipps und Erfahrungen


Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von ewx (Top Expert / 3917 / 160 / 348 ) » 5. Dez 2018 16:59

Das ist keine CSV Datei. CSV bedeutet "Comma separated Values".
Du hast eine Datei mit fester Satzlänge.

Diese musst du entsprechend der Struktur einlesen.
Dezimalzahlen musst du entsprechend einlesen und zur Weiterverarbeitung ins interne Format "123456.78-" umwandeln.

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von DeathAndPain (Top Expert / 1012 / 115 / 223 ) » 5. Dez 2018 17:16

Das ist keine CSV Datei. CSV bedeutet "Comma separated Values".
Im weiteren Sinne werden aber alle ASCII-Tabellen, deren Spalten durch ein Trennzeichen voneinander getrennt sind, als CSV-Dateien bezeichnet. Ich möchte behaupten, dass semikolonseparierte CSV-Dateien häufiger sind als kommaseparierte, und tabulatorseparierte sieht man auch gelegentlich.

Trotzdem hast Du natürlich recht, dass Dateien mit Spalten fester Länge nicht darunter fallen.

@cgreiner: Ich würde die Datei einfach per OPEN DATASET, TRANSFER und CLOSE DATASET Zeile für Zeile in eine Tabelle vom Type TABLE_OF_STRINGS einlesen. Über die machste dann einen Loop und zerlegst jede Zeile mit den üblichen ABAP-Zeichenkettenausdrücken in ihre Bestandteile, die Du dann in Deiner vernünftig typisierten Zieltabelle ablegst.

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von cgreiner (ForumUser / 17 / 2 / 0 ) » 5. Dez 2018 22:09

Enno,

Warum ist dies keine CSV-Datei, die in Excel geöffnet habe und so einkopiert habe.
LFDNR;STKL;AF;F;ZKF;AJAHR;ALTER1;RE4;VBEZ;LZZ;KRV;KVZ;PKPV;PKV;PVS;PVZ;R;LZZFREIB;LZZHINZU;VJAHR;VBEZM;VBEZS;ZMVB;JRE4;JVBEZ;JFREIB;JHINZU;JRE4ENT;SONSTB;STERBE;VBS;SONSTENT;VKAPA;VMT;ENTSCH;LSTLZZ;SOLZLZZ;BK;STS;SOLZS;BKS;STV;SOLZV;BKV;VKVLZZ;VKVSONST;VFRB;VFRBS1;VFRBS2;WVFRB;WVFRBO;WVFRBM;VGL-KZ
00021;4;1;0,741;05,5;0000;0;00002049327;00000000000;1;2;0,00000;00000030144;2;0;0;1;00000000000;00000000000;0000;00000000000;00000000000;00;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000135100;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000192146; ;00000100000;00000000000;00000000000;00000853527;00000000000;00000000000;OK

Die Felder können nicht als zahlmitnk type p decimals 2 definiert werden, also als string einlesen und in zahl umwandeln.

Ich suche nach eleganteren Lösungen!

cg

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von Daniel (Specialist / 308 / 67 / 39 ) » 6. Dez 2018 12:16

Wenn man Tabulatoren als Trennzeichen verwendet
funktioniert das eigentlich recht zuverlässig.
In einer normalen Datei kommen Tabulatoren in der
Regel nicht vor - das unterscheidet Sie von anderen
Trennzeichen die auch als Inhalt vorkommen können.

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von ewx (Top Expert / 3917 / 160 / 348 ) » 6. Dez 2018 12:46

cgreiner hat geschrieben: Warum ist dies keine CSV-Datei, die in Excel geöffnet habe und so einkopiert habe.
LFDNR;STKL;AF;F;ZKF;AJAHR;ALTER1;RE4;VBEZ;LZZ;KRV;KVZ;PKPV;PKV;PVS;PVZ;R;LZZFREIB;LZZHINZU;VJAHR;VBEZM;VBEZS;ZMVB;JRE4;JVBEZ;JFREIB;JHINZU;JRE4ENT;SONSTB;STERBE;VBS;SONSTENT;VKAPA;VMT;ENTSCH;LSTLZZ;SOLZLZZ;BK;STS;SOLZS;BKS;STV;SOLZV;BKV;VKVLZZ;VKVSONST;VFRB;VFRBS1;VFRBS2;WVFRB;WVFRBO;WVFRBM;VGL-KZ
00021;4;1;0,741;05,5;0000;0;00002049327;00000000000;1;2;0,00000;00000030144;2;0;0;1;00000000000;00000000000;0000;00000000000;00000000000;00;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000135100;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000000000;00000192146; ;00000100000;00000000000;00000000000;00000853527;00000000000;00000000000;OK
DAS ist eine CSV.
Bei dem, was du zuerst gepostet hast, konnte man leider nicht sehen, dass du sie aus Excel kopiert hast.

Schau mal hier: https://www.tricktresor.de/blog/umwandl ... uktur-csv/
Da wird die Erstellung einer CSV-Datei beschrieben.
Der umgekehrte Weg funktioniert mit Methode CSV_TO_STRUCTURE.
Die Feldkonvertierung wirst du trotzdem nachträglich machen müssen.

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitrag von Legxis (Specialist / 131 / 56 / 23 ) » 14. Dez 2018 15:52

Hier ein Beispiel mit csv_to_structure, ist so ausführbar

Definitionen und Deklarationen

Code: Alles auswählen.

TYPES: BEGIN OF ty_csv,
  matnr TYPE matnr,        " Materialnummer
  ersda TYPE string,       " Erstelldatum Format 31.12.2999
END OF ty_csv.

TYPES: BEGIN OF ty_itab,
  matnr TYPE matnr,        " Materialnummer
  ersda TYPE ersda,        " Erstelldatum Format 99991231
END OF ty_itab.

DATA: t_itab  TYPE STANDARD TABLE OF ty_itab,
      wa_csv  TYPE ty_csv,
      wa_itab TYPE ty_itab.

* Upload Variable
DATA: h_filepath TYPE string.

* alv Listausgabe
DATA: go_alv              TYPE REF TO  cl_salv_table,
      go_columns          TYPE REF TO  cl_salv_columns_table,
      go_display          TYPE REF TO  cl_salv_display_settings,
      go_layout           TYPE REF TO  cl_salv_layout,
      go_functions        TYPE REF TO  cl_salv_functions_list,      " toolbar
      go_selections       TYPE REF TO  cl_salv_selections,          " multiselect
      gx_salv_msg         TYPE REF TO  cx_salv_msg,                 " exceptions
      gx_salv_data_error  TYPE REF TO  cx_salv_data_error,
      gs_layoutkey        TYPE         salv_s_layout_key.
Programmstart

Code: Alles auswählen.

PERFORM file_dialog.
PERFORM csv_upload.

IF t_itab IS NOT INITIAL.
  PERFORM get_alv_settings.
  go_alv->display( ).
ELSE.
  MESSAGE 'Tabelle ist leer!' TYPE 'I'.
ENDIF.

Code: Alles auswählen.

*---------------------------------------------------------------------*
*      Form  file_dialog
*---------------------------------------------------------------------*
*       File Dialog zum Aussuchen der CSV Datei
*---------------------------------------------------------------------*
FORM file_dialog.

  DATA: h_files   TYPE filetable,
        h_count   TYPE i,
        h_action  TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog(
    EXPORTING
      initial_directory = 'C:\......'
      default_filename  = '*.csv'
      file_filter       = '*.csv'
    CHANGING
      file_table  = h_files
      rc          = h_count
      user_action = h_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5 ).

  IF sy-subrc = 0.

*   Dateipfad speichern, wenn der User nicht Abbrechen oder X geklickt hat
    IF h_action <> 9.
      READ TABLE h_files INDEX 1 INTO h_filepath.
    ELSE.
      MESSAGE 'Dateiupload abgebrochen!' TYPE 'E'.
    ENDIF.

  ELSE.
    MESSAGE 'Error beim Auswählen der Datei!' TYPE 'E'.
  ENDIF.

ENDFORM.                    "file_dialog

Code: Alles auswählen.

*---------------------------------------------------------------------*
*      Form  csv_upload
*---------------------------------------------------------------------*
*       CSV Datei hochladen und in itab konvertieren
*---------------------------------------------------------------------*
FORM csv_upload.

  DATA: t_upload  TYPE textline_t,
        wa_upload TYPE string.

  DATA h_datum TYPE string.

  DATA go_csv TYPE REF TO cl_rsda_csv_converter.

  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename                = h_filepath
      filetype                = 'ASC'
      has_field_separator     = abap_true
    CHANGING
      data_tab                = t_upload
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      not_supported_by_gui    = 17
      error_no_gui            = 18
      OTHERS                  = 19.

  IF sy-subrc <> 0.
    MESSAGE 'Error beim Upload der Datei!' TYPE 'E'.
  ENDIF.

* Das Konvertierungs-Objekt erzeugen
  CALL METHOD cl_rsda_csv_converter=>create
    EXPORTING
      i_separator = ';'
    RECEIVING
      r_r_conv    = go_csv.

  LOOP AT t_upload INTO wa_upload.

*   Die mit Semikolon getrennten Einträge in einzelne Zellen aufteilen
    CALL METHOD go_csv->csv_to_structure
      EXPORTING
        i_data   = wa_upload
      IMPORTING
        e_s_data = wa_csv.

*   Wenn wenigstens irgendwas in Zeile steht, dann in Tabelle schreiben
    IF wa_csv-matnr IS NOT INITIAL OR wa_csv-ersda IS NOT INITIAL.

*     In itab übertragen, ggf. Prüfungen/IF-Bedingungen machen
      wa_itab-matnr = wa_csv-ersda.
      CONCATENATE wa_csv-ersda+6(4) wa_csv-ersda+3(2) wa_csv-ersda(2) INTO h_datum.
      wa_itab-ersda = h_datum.

      APPEND wa_itab TO t_itab.

    ENDIF.

    CLEAR: wa_itab, wa_csv, h_datum.

  ENDLOOP.

ENDFORM.                    "csv_upload

Code: Alles auswählen.

*---------------------------------------------------------------------*
*      Form  get_alv_settings
*---------------------------------------------------------------------*
*       Ergebnisumfeld und -tabelle erstellen
*---------------------------------------------------------------------*

FORM get_alv_settings.

  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = go_alv
      CHANGING
        t_table = t_itab ).
    CATCH cx_salv_msg INTO gx_salv_msg.
      MESSAGE 'Die Listenausgabe konnte nicht generiert werden' TYPE 'E'.
  ENDTRY.

* Zeilen farblich unterscheiden
  TRY.
      go_display = go_alv->get_display_settings( ).
      go_display->set_striped_pattern( abap_true ).
    CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

* Spaltenbreite optimieren
  TRY.
      go_columns = go_alv->get_columns( ).
      go_columns->set_optimize( 'X' ).
    CATCH cx_salv_data_error INTO gx_salv_data_error.
  ENDTRY.

* Funktionstasten (Sortieren, Filtern, Excel-Export etc.)
  go_functions = go_alv->get_functions( ).
  go_functions->set_all( abap_true ).

* Dem Benutzer erlauben, eigene Anzeigevarianten zu speichern
  go_layout = go_alv->get_layout( ).
  gs_layoutkey-report = sy-repid.
  go_layout->set_key( gs_layoutkey ).
  go_layout->set_default( abap_true ).
  go_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

* Dem Benutzer erlauben, mehrere Zellen/Zeilen/Spalten zu selektieren
  go_selections = go_alv->get_selections( ).
  CALL METHOD go_selections->set_selection_mode
    EXPORTING
      value = if_salv_c_selection_mode=>multiple.

* Titel
  go_display = go_alv->get_display_settings( ).
  go_display->set_list_header( 'Inhalt der importierten CSV' ).

ENDFORM.                    "get_alv_settings
Ich bin dankbar für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )

Seite 1 von 1

Aktuelle Forenbeiträge

Business Partner Konzept
vor 2 Stunden von msfox 3 / 217
Exception Handling FuBa test
vor 9 Stunden von ichse18577 1 / 40
CDS-Views / AMDP für HCM
vor 12 Stunden von RaCDigger 6 / 316
Kreditlimitprüfung Obligo
vor 17 Stunden von SAP_ENTWICKLER 3 / 163

Unbeantwortete Forenbeiträge

Exception Handling FuBa test
vor 9 Stunden von ichse18577 1 / 40
Verursachervormerkung OCM manuell anlegen
vor 6 Tagen von Aba 1 / 127
Auflösen MILL_OC - Auftragszusammenfassung
vor einer Woche von tofralu 1 / 109
Löschen von archivierten Drucklisten
vor einer Woche von Asaph 1 / 99