Import einer CSV-Datei mit Nachkommazahlen


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Import einer CSV-Datei mit Nachkommazahlen

Beitragvon cgreiner » 05.12.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
cgreiner
ForumUser
 
Beiträge: 17
Registriert: 18.10.2018, 17:12
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon ewx » 05.12.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.
ewx
Top Expert
 
Beiträge: 3779
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 311 mal

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon DeathAndPain » 05.12.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.
DeathAndPain
Expert
 
Beiträge: 814
Registriert: 05.05.2006, 10:14
Dank erhalten: 189 mal
Ich bin: Entwickler/in

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon cgreiner » 05.12.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
cgreiner
ForumUser
 
Beiträge: 17
Registriert: 18.10.2018, 17:12
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon Daniel » 06.12.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.
Daniel
Specialist
 
Beiträge: 291
Registriert: 10.09.2003, 13:20
Wohnort: Bielefeld
Dank erhalten: 33 mal

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon ewx » 06.12.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.
ewx
Top Expert
 
Beiträge: 3779
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 311 mal

Re: Import einer CSV-Datei mit Nachkommazahlen

Beitragvon Legxis » 14.12.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 )
Legxis
Specialist
 
Beiträge: 130
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 22 mal
Ich bin: Student/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
s4hana-cloud
vor 8 Stunden von sap_inchen 1 Antw.
500 Internal Server Error
vor 16 Stunden von zzcpak 1 Antw.
Dokumentinformationen lesen vom DVS
vor 18 Stunden von Tron 4 Antw.
Tabs innerhalb von Tabs
vor 19 Stunden von ewx 4 Antw.
Fakturierungsplan in Kontrakten ändern
vor 15 Stunden von DeathAndPain 1 Antw.

  Ähnliche Beiträge beta
gelöst Einlesen einer csv-Datei in SAP R/3
06.08.2007, 08:19 von Niekohle 7 Antw.
Lesen einer .TXT-Datei
28.06.2005, 09:24 von Syntex 3 Antw.
Download einer .csv- oder .txt-Datei
09.05.2011, 13:04 von a-dead-trousers 1 Antw.
Erstelldatum einer Datei auf dem Applikationsserver
03.10.2018, 23:25 von black_adept 7 Antw.
Erstellung einer Excel-Datei mit Spaltenüberschriften
15.06.2005, 10:47 von Jura 2 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder