es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error REGEX_TOO_COMPLEX al analizar la expresión regular

Necesito dividir el archivo CSV en comas, pero el problema es que el archivo puede contener comas dentro de los campos. Por ejemplo:

uno, dos, tres, “cuatro, cinco”, “seis, siete”.

Utiliza comillas dobles para escapar, pero no pude resolverlo.
Intenté usar algo como esto con esta expresión regular, pero obtuve un error: REGEX TOO COMPLEX.

data: lv_sep     type string,
  lv_rep_pat type string.
data(lv_row) = iv_row.

“Define un separador para reemplazar las comas en comillas dobles
lv_sep = cl_abap_conv_in_ce=>uccpi( uccp = 10 ).
concatenate ‘$1$2’ lv_sep into lv_rep_pat.
“reemplazar todas las comas que son separadores con el nuevo separador
replace all occurrences of regex ‘(?:”((?:””|[^”])+)”|([^,]*))(?:,|$)’ in lv_row with lv_rep_pat.

split lv_row at lv_sep into table rt_cells.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para dividir un archivo CSV en comas teniendo en cuenta las comas dentro de los campos, se puede utilizar una expresión regular para detectar el delimitador entre los campos. En este caso, el archivo utiliza comillas dobles para escapar las comas dentro de los campos. La expresión regular para manejar este escenario puede ser compleja, pero aquí hay un ejemplo de código en ABAP:

    DATA: lv_sep     TYPE string,
          lv_row     TYPE string,
          lv_rep_pat TYPE string.
    
    " Define un separador para reemplazar las comas dentro de las comillas dobles
    lv_sep = cl_abap_conv_in_ce=>uccpi( uccp = 10 ).
    
    CONCATENATE '$1$2' lv_sep INTO lv_rep_pat.
    
    " Reemplaza todas las comas que son un separador por el nuevo separador
    REPLACE ALL OCCURRENCES OF REGEX '(?:"((?:""|[^"])+)"|([^,]*))(?:,|$)' IN lv_row WITH lv_rep_pat
      RESULT = lv_row.
    
    " Divide la fila en el separador en una tabla de celdas
    SPLIT lv_row AT lv_sep INTO TABLE rt_cells.
    

    El patrón de expresión regular utilizado en este ejemplo se puede desglosar de la siguiente manera:
    (?: grupo de no captura para distinguir dos alternativas
    "(?:""|[^"])+") coincide con comillas dobles que encierran cualquier número de caracteres que no sean comillas o pares de comillas dobles
    | o
    ([^,]*) coincide con cualquier número de caracteres que no sean comas
    ) finaliza el grupo de no captura
    (?:,|$) coincide con una coma o el final de línea como siguiente carácter

    Este patrón captura texto entre comillas o texto sin comillas y reemplaza las comas delimitadoras dentro de las comillas con un separador único. La función de división luego divide la cadena en el separador en una tabla de celdas.

Comments are closed.