separar una cadena en base a un delimitador en varios campos

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jamiguel77
    Junior Member
    • jun
    • 21

    #1

    separar una cadena en base a un delimitador en varios campos

    Hola amigos, estoy teniendo problemas con algo muy sencillo:

    Tengo un archive: prueba.csv

    UD00000000;0090000000;50.26
    UD00000000;0090000002;45.56
    UD00000000;0090000004;300.25-
    UD00000000;0090000005;45.26
    UD00000000;0090000024;48.15
    UA00000000;0090000025;11.17
    UA00000000;0090000027;200.58-
    UD00000000;0090000030;600.25
    UD00000000;0090000031;123.95
    UA00000000;0090000032;-201.63

    quiero agarrar cada linea y separarla en base al separador ';' y meter el resultado en una table interna, les dejo mi codigo:

    Código:
    REPORT Z_JE_CC.
    *Definimos el tipo de tabla(la estructura)
    TYPE-POOLS:  truxs.
    
    types: begin of t_tabla,
             f1(20) type c,
             f2(20) type c,
             f3(20) type c,
    *         f3 type p decimals 3,
           end of t_tabla.
    types: begin of t_tabla2,
             f1(100) type c,
    *         f3 type p decimals 3,
           end of t_tabla2.
    data: it_tabla type table of t_tabla, it_tablauncampo TYPE TABLE OF t_tabla2.
    field-symbols: <fs_tabla> type standard table, <fs_wa> like line of it_tabla, <fs_wa2> like line of it_tablauncampo.
    
    
    SELECTION-SCREEN BEGIN OF BLOCK Pant_Capt WITH FRAME TITLE Text-001.
    
    Parameters: p_arch LIKE RLGRAP-FILENAME Obligatory DEFAULT 'c:\temp\prueba.csv'.
    
    SELECTION-SCREEN END OF BLOCK Pant_Capt.
    
    At Selection-Screen On Value-Request For p_arch.
      CALL FUNCTION 'F4_FILENAME'
        EXPORTING
          PROGRAM_NAME  = SY-REPID
          DYNPRO_NUMBER = SY-DYNNR
          FIELD_NAME    = 'PATH'
        IMPORTING
          FILE_NAME     = P_arch.
    *BREAK-POINT.
      if sy-subrc = 0.
        clear it_tabla.
        unassign <fs_tabla>.
        "Cargamos la tabla de un solo campo.
        perform Load_Archivo_itab tables it_tablauncampo using p_arch.
        ASSIGN it_tablauncampo to <fs_tabla>.
        perform Separar_Tabla tables it_tabla it_tablauncampo.
        assign it_tabla to <fs_tabla>.
        BREAK-POINT.
      else.
        MESSAGE E398(00) WITH 'Error no se selecciono Archivo'.
      endif.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLA  text
    *      -->P_P_ARCH  text
    *----------------------------------------------------------------------*
    FORM LOAD_ARCHIVO_ITAB  TABLES   P_IT_TABLA
                                       "Insert correct name for <...>
                            USING    P_P_ARCH.
      data: lv_xi type i.
      REFRESH P_IT_TABLA.
      CALL FUNCTION 'WS_UPLOAD'
        EXPORTING
          filename            = P_P_ARCH
          filetype            = 'ASC'
        TABLES
          data_tab            = P_IT_TABLA
        EXCEPTIONS
          conversion_error    = 1
          file_open_error     = 2
          file_read_error     = 3
          invalid_table_width = 4
          invalid_type        = 5
          no_batch            = 6
          unknown_error       = 7
          OTHERS              = 8.
      IF sy-subrc NE 0.
        WRITE : ' Error in opening file : ' , P_P_ARCH.
        STOP.
      ENDIF.
      DESCRIBE TABLE P_IT_TABLA lines lv_xi.
    *  BREAK-POINT.
    ENDFORM.                    "LOAD_ARCHIVO_ITAB
    " LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *&      Form  SEPARAR_TABLA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLE  text
    *----------------------------------------------------------------------*
    FORM SEPARAR_TABLA  TABLES   P_IT_TABLA P_it_tablauncampo .
      "Insert correct name for <...>.
      field-symbols: <fs_xtabla> type STANDARD TABLE, <fs_xwa> type any.
      constants: separator(1) type c value ';'.
    *  data: lv_aux(100) type c.
      data: lv_aux type string, lv_aux2 type string, gt_raw_data  TYPE truxs_t_text_data, go_table     TYPE REF TO cl_salv_table.
    *  assign p_it_tablauncampo to <fs_xtabla>.
      assign it_tablauncampo to <fs_xtabla>.
      break-point.
      CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
        EXPORTING
         I_FIELD_SEPERATOR          = ';'
         i_tab_raw_data             = it_tablauncampo[]
    
        TABLES
          I_TAB_CONVERTED_DATA       = it_tabla[]
       EXCEPTIONS
         CONVERSION_FAILED          = 1
         OTHERS                     = 2.
      IF SY-SUBRC <> 0.
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      break-point.
      loop at <fs_xtabla> ASSIGNING <fs_wa2>.
         lv_aux2 = <fs_wa2>-f1.
    *     SPLIT lv_aux2  AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB  INTO TABLE it_tabla.
    *      lv_aux2 = <fs_wa2>-f1.
    *     lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    *     SPLIT lv_aux2 at separator into lv_aux.
    *      BREAK-POINT.
      endloop.
    
      TRY.
          CALL METHOD cl_salv_table=>factory
    *    EXPORTING
    *      LIST_DISPLAY   = IF_SALV_C_BOOL_SAP=>FALSE
    *      R_CONTAINER    =
    *      CONTAINER_NAME =
            IMPORTING
              r_salv_table   = go_table
            CHANGING
              t_table        = it_tabla.
        CATCH cx_salv_msg .
      ENDTRY.
      break-point.
    
      go_table->display( ).
    
    ENDFORM.                    " SEPARAR_TABLA
    Lo que he intentado:

    1) al mandar llamado:

    CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
    EXPORTING
    I_FIELD_SEPERATOR = ';'
    i_tab_raw_data = it_tablauncampo[]

    TABLES
    I_TAB_CONVERTED_DATA = it_tabla[]
    EXCEPTIONS
    CONVERSION_FAILED = 1
    OTHERS = 2.

    tambien lo intente sin los [] me marca este error:


    Short Text
    Type conflict when calling the function module "TEXT_CONVERT_TEX_TO_SAP".

    no se por que, si sigo la documentacion.

    2) Intente tambien esto:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * BREAK-POINT.
    endloop.

    Esto me funciono un poco mas, pero el problema es que: mi archive (cada linea) tiene separacion con un punto y coma, no con un # entonces me lo separa bien raro.

    No encontre como indicarle a la function que el separador era ';'

    3) Quise hacerlo manualmente:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT separator INTO lv_aux.
    * SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * lv_aux2 = <fs_wa2>-f1.
    * lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    * SPLIT lv_aux2 at separator into lv_aux.
    * BREAK-POINT.
    endloop.

    La variable lv_aux esta declarada como string pero aun asi me marca el siguiente error al checker el codigo (f2) antes de activar:

    Unable to interpret "LV_AUX". Possible causes: Incorrect spelling or comma error.

    Algun consejo?


    Les agradezco, se que es un problema sencillo, pero no me sale.

    Gracias.
  • Esteban Dueñas Avalos
    Junior Member
    • sep
    • 4

    #2
    Separar caracteres

    hola jamiguel77

    el Split deberías de utilizarlo de esta manera, pruébalo espero que te sirva:
    loop at <fs_xtabla> ASSIGNING <fs_wa2>.

    Split <fs_wa2> at ';' into t_tabla
    ...
    ....
    endloop
    QUOTE=jamiguel77]Hola amigos, estoy teniendo problemas con algo muy sencillo:

    Tengo un archive: prueba.csv

    UD00000000;0090000000;50.26
    UD00000000;0090000002;45.56
    UD00000000;0090000004;300.25-
    UD00000000;0090000005;45.26
    UD00000000;0090000024;48.15
    UA00000000;0090000025;11.17
    UA00000000;0090000027;200.58-
    UD00000000;0090000030;600.25
    UD00000000;0090000031;123.95
    UA00000000;0090000032;-201.63

    quiero agarrar cada linea y separarla en base al separador ';' y meter el resultado en una table interna, les dejo mi codigo:

    Código:
    REPORT Z_JE_CC.
    *Definimos el tipo de tabla(la estructura)
    TYPE-POOLS:  truxs.
    
    types: begin of t_tabla,
             f1(20) type c,
             f2(20) type c,
             f3(20) type c,
    *         f3 type p decimals 3,
           end of t_tabla.
    types: begin of t_tabla2,
             f1(100) type c,
    *         f3 type p decimals 3,
           end of t_tabla2.
    data: it_tabla type table of t_tabla, it_tablauncampo TYPE TABLE OF t_tabla2.
    field-symbols: <fs_tabla> type standard table, <fs_wa> like line of it_tabla, <fs_wa2> like line of it_tablauncampo.
    
    
    SELECTION-SCREEN BEGIN OF BLOCK Pant_Capt WITH FRAME TITLE Text-001.
    
    Parameters: p_arch LIKE RLGRAP-FILENAME Obligatory DEFAULT 'c:\temp\prueba.csv'.
    
    SELECTION-SCREEN END OF BLOCK Pant_Capt.
    
    At Selection-Screen On Value-Request For p_arch.
      CALL FUNCTION 'F4_FILENAME'
        EXPORTING
          PROGRAM_NAME  = SY-REPID
          DYNPRO_NUMBER = SY-DYNNR
          FIELD_NAME    = 'PATH'
        IMPORTING
          FILE_NAME     = P_arch.
    *BREAK-POINT.
      if sy-subrc = 0.
        clear it_tabla.
        unassign <fs_tabla>.
        "Cargamos la tabla de un solo campo.
        perform Load_Archivo_itab tables it_tablauncampo using p_arch.
        ASSIGN it_tablauncampo to <fs_tabla>.
        perform Separar_Tabla tables it_tabla it_tablauncampo.
        assign it_tabla to <fs_tabla>.
        BREAK-POINT.
      else.
        MESSAGE E398(00) WITH 'Error no se selecciono Archivo'.
      endif.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLA  text
    *      -->P_P_ARCH  text
    *----------------------------------------------------------------------*
    FORM LOAD_ARCHIVO_ITAB  TABLES   P_IT_TABLA
                                       "Insert correct name for <...>
                            USING    P_P_ARCH.
      data: lv_xi type i.
      REFRESH P_IT_TABLA.
      CALL FUNCTION 'WS_UPLOAD'
        EXPORTING
          filename            = P_P_ARCH
          filetype            = 'ASC'
        TABLES
          data_tab            = P_IT_TABLA
        EXCEPTIONS
          conversion_error    = 1
          file_open_error     = 2
          file_read_error     = 3
          invalid_table_width = 4
          invalid_type        = 5
          no_batch            = 6
          unknown_error       = 7
          OTHERS              = 8.
      IF sy-subrc NE 0.
        WRITE : ' Error in opening file : ' , P_P_ARCH.
        STOP.
      ENDIF.
      DESCRIBE TABLE P_IT_TABLA lines lv_xi.
    *  BREAK-POINT.
    ENDFORM.                    "LOAD_ARCHIVO_ITAB
    " LOAD_ARCHIVO_ITAB
    *&---------------------------------------------------------------------*
    *&      Form  SEPARAR_TABLA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_IT_TABLE  text
    *----------------------------------------------------------------------*
    FORM SEPARAR_TABLA  TABLES   P_IT_TABLA P_it_tablauncampo .
      "Insert correct name for <...>.
      field-symbols: <fs_xtabla> type STANDARD TABLE, <fs_xwa> type any.
      constants: separator(1) type c value ';'.
    *  data: lv_aux(100) type c.
      data: lv_aux type string, lv_aux2 type string, gt_raw_data  TYPE truxs_t_text_data, go_table     TYPE REF TO cl_salv_table.
    *  assign p_it_tablauncampo to <fs_xtabla>.
      assign it_tablauncampo to <fs_xtabla>.
      break-point.
      CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
        EXPORTING
         I_FIELD_SEPERATOR          = ';'
         i_tab_raw_data             = it_tablauncampo[]
    
        TABLES
          I_TAB_CONVERTED_DATA       = it_tabla[]
       EXCEPTIONS
         CONVERSION_FAILED          = 1
         OTHERS                     = 2.
      IF SY-SUBRC <> 0.
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      break-point.
      loop at <fs_xtabla> ASSIGNING <fs_wa2>.
         lv_aux2 = <fs_wa2>-f1.
    *     SPLIT lv_aux2  AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB  INTO TABLE it_tabla.
    *      lv_aux2 = <fs_wa2>-f1.
    *     lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    *     SPLIT lv_aux2 at separator into lv_aux.
    *      BREAK-POINT.
      endloop.
    
      TRY.
          CALL METHOD cl_salv_table=>factory
    *    EXPORTING
    *      LIST_DISPLAY   = IF_SALV_C_BOOL_SAP=>FALSE
    *      R_CONTAINER    =
    *      CONTAINER_NAME =
            IMPORTING
              r_salv_table   = go_table
            CHANGING
              t_table        = it_tabla.
        CATCH cx_salv_msg .
      ENDTRY.
      break-point.
    
      go_table->display( ).
    
    ENDFORM.                    " SEPARAR_TABLA
    Lo que he intentado:

    1) al mandar llamado:

    CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
    EXPORTING
    I_FIELD_SEPERATOR = ';'
    i_tab_raw_data = it_tablauncampo[]

    TABLES
    I_TAB_CONVERTED_DATA = it_tabla[]
    EXCEPTIONS
    CONVERSION_FAILED = 1
    OTHERS = 2.

    tambien lo intente sin los [] me marca este error:


    Short Text
    Type conflict when calling the function module "TEXT_CONVERT_TEX_TO_SAP".

    no se por que, si sigo la documentacion.

    2) Intente tambien esto:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * BREAK-POINT.
    endloop.

    Esto me funciono un poco mas, pero el problema es que: mi archive (cada linea) tiene separacion con un punto y coma, no con un # entonces me lo separa bien raro.

    No encontre como indicarle a la function que el separador era ';'

    3) Quise hacerlo manualmente:

    loop at <fs_xtabla> ASSIGNING <fs_wa2>.
    lv_aux2 = <fs_wa2>-f1.
    SPLIT lv_aux2 AT separator INTO lv_aux.
    * SPLIT lv_aux2 AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE it_tabla.
    * lv_aux2 = <fs_wa2>-f1.
    * lv_aux2 = 'aa;bb;cc;dddd;ee;'.
    * SPLIT lv_aux2 at separator into lv_aux.
    * BREAK-POINT.
    endloop.

    La variable lv_aux esta declarada como string pero aun asi me marca el siguiente error al checker el codigo (f2) antes de activar:

    Unable to interpret "LV_AUX". Possible causes: Incorrect spelling or comma error.

    Algun consejo?


    Les agradezco, se que es un problema sencillo, pero no me sale.

    Gracias.[/QUOTE]

    Comentario

    • jamiguel77
      Junior Member
      • jun
      • 21

      #3
      Listo, Funciono!!!



      Código:
      loop at  ASSIGNING .
           lv_aux2 = -f1.
           SPLIT lv_aux2 AT ';' into
              it_table-f1
              it_table-f2
              it_table-f3.
           append it_table.
      endloop.
      tuve que declarer mi table WITH HEADER LINE

      tambien lo solucione mandando llamar la FM:

      'TEXT_CONVERT_TEX_TO_SAP'

      quedando:


      Código:
        CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
          EXPORTING
            I_FIELD_SEPERATOR    = ';'
            i_tab_raw_data       = gt_raw_data[]
          TABLES
            I_TAB_CONVERTED_DATA = it_table[]
          EXCEPTIONS
            CONVERSION_FAILED    = 1
            OTHERS               = 2.
        IF SY-SUBRC <> 0.
          MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

      Gracias Felices Fiestas.

      Saludos.

      Comentario

      Trabajando...