¿Cómo utilizar el array de división?

String data = "12-Jan,TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI  ,0,\"50,000.00 CR\",\"3,583,090.00\" ";
System.out.println(data);

output :
12-Jan,TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI  ,0,"50,000.00 CR","3,583,090.00"
String[] items = data.split(",");
System.out.println(new Gson().toJson(items));

output :
["12-Jan","TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI  ","0","\"50","000.00 CR\"","\"3","583","090.00\""]

¿Cómo hacer que la coma que está dentro de las citas no se divida?

Producto previsto:

["12-Jan","TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI","0","50,000.00 CR","3,583,090.00"]

Pregunta hecha hace 3 años, 4 meses, 29 días - Por csharpsorcerer


4 Respuestas:

  • Como comentario de @Thomas sabiamente sugiere arriba, un bien CSV parser que puede ser instruido que la cita doble es un personaje de escape es probablemente la mejor manera de ir aquí. Si estás atrapado haciendo esto desde cero en Java, (regex) se puede utilizar, con el siguiente patrón:

    ".*?"|[^,]+
    

    Esto intentará igualar un doble término citado primero. Sólo si no puede encontrar tal término, entonces consumirá arbitrariamente hasta golpear el siguiente separador de coma (no dentro de una cita doble). Podemos usar un emparejador de patrón de Java regex formal aquí:

    List terms = new ArrayList<>();
    String data = "12-Jan,TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI  ,0,\"50,000.00 CR\",\"3,583,090.00\" ";
    String pattern = "\".*?\"|[^,]+";
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(data.trim());
    while (m.find()) {
        terms.add(m.group(0).trim());
    }
    System.out.println(terms);
    

    Esta impresión:

    [12-Jan, TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI, 0,
     "50,000.00 CR", "3,583,090.00"]
    

    Respondida el Dec 17, 2020 a las 08:24 - por stackscripter

    Votos positivos: 0 | Votos negativos: 0

  • String data = "12-Jan,TRSF E-BANKING CR 12/01 95031 NABUNG" +
            " M1 DES  AGUS JENI  ,0,\"50,000.00 CR\",\"3,583,090.00\" ";
    
    // any sequence of characters
    // between quotes, or a single comma
    String pattern = "\".*?\"|,+";
    
    String[] arr1 = data
            // append substrings that matches the given
            // pattern with additional delimiter characters
            .replaceAll(pattern, "$0::::")
            // remove comma
            .replace(",::::", "::::")
            // split into an array
            // by delimiter characters
            .split("::::", 0);
    
    // remove leading and trailing
    // whitespaces and empty strings,
    // replace sequence of whitespace
    // characters with a single whitespace
    String[] arr2 = Arrays.stream(arr1)
            .map(String::trim)
            .map(str -> str.replaceAll("\\s+", " "))
            .filter(str -> str.length() > 0)
            .toArray(String[]::new);
    
    // output in a column
    Arrays.stream(arr2).forEach(System.out::println);
    // 12-Jan
    // TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES AGUS JENI
    // 0
    // "50,000.00 CR"
    // "3,583,090.00"
    

    Respondida el Dec 17, 2020 a las 08:31 - por binaryblossom

    Votos positivos: 0 | Votos negativos: 0

  • Para evitar que la coma que está dentro de las comillas se divida al usar el método split(","), puedes utilizar un regex en lugar de simplemente pasando la coma como el separador. En este caso, puedes utilizar la expresión regular ,(?=(?:[^\"]<strong>\"[^\"]</strong>\")<strong>[^\"]</strong>$) en el método split para asegurarte de que la coma que se encuentra dentro de las comillas no se tome como separador.

    Aquí te muestro cómo modificar tu código para lograr el resultado esperado:

    java
    String data = "12-Jan,TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI  ,0,\"50,000.00 CR\",\"3,583,090.00\" ";
    System.out.println(data);
    
    String[] items = data.split(",(?=(?:[^\"]\"[^\"]\")[^\"]$)");
    System.out.println(new Gson().toJson(items));
    

    Con este cambio, el output esperado debería ser:

    
    ["12-Jan","TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI","0","50,000.00 CR","3,583,090.00"]
    

    Ahora, al dividir la cadena utilizando la expresión regular proporcionada, se evitará que las comas dentro de las comillas se tomen como separadores.

    Respondida el Dec 18, 2020 a las 08:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para evitar que las comas dentro de las citas se dividan, debes utilizar un delimitador que no aparezca en los datos que deseas separar. En este caso, puedes utilizar una expresión regular como delimitador:

    java
    String[] items = data.split("(?

    El delimitador (?<!\\\"), divide la cadena en comas, excepto las que están precedidas por una barra invertida (\). La barra invertida actúa como carácter de escape, lo que indica que la coma siguiente no debe tratarse como delimitador.

    Esto producirá el resultado deseado:

    
    ["12-Jan", "TRSF E-BANKING CR 12/01 95031 NABUNG M1 DES  AGUS JENI", "0", "50,000.00 CR", "3,583,090.00"]
    

    Respondida el Dec 18, 2020 a las 08:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0