PDA

Ver la Versión Completa : separar una cadena en base a un delimitador en varios campos


jamiguel77
29/12/14, 18:00:23
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:


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
29/12/14, 19:08:42
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:


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]

jamiguel77
30/12/14, 23:59:15
Listo, Funciono!!!



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:


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.