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.

Parsing un archivo CSV con campos de múltiples líneas utilizando au.com.bytecode.opencsv.CSVReader.CSVReader.

Quiero analizar un archivo .csv en Java. La mayoría de las líneas (filas) en el archivo siguen la convención típica de .csv, pero hay algunos casos que causan problemas. En realidad, no estoy seguro si esos casos están permitidos o no en un documento en formato .csv. El mayor problema es la celda de varias líneas con el texto envuelto entre comillas:

"text",12345,"text2"
"text",45678,"text2"
"text",23456,"text
en varias
líneas"

Entonces, en este caso, una sola celda se puede identificar de manera única por las comillas, por lo que supongo que podría funcionar, pero no puedo hacer que el CSVReader lo analice correctamente. ¿Alguna idea de cómo configurarlo para que reconozca estos campos de varias líneas como un único campo?

Así es cómo analizo un archivo CSV en Java:

try(FileInputStream fio = new FileInputStream(csvFile);
        InputStreamReader isr =  new InputStreamReader(fio, StandardCharsets.UTF_8);
        CSVReader reader = new CSVReader(isr, ';', '"', true)){

        String[] line;
        reader.readNext(); //saltar encabezado
        while((line = reader.readNext()) != null) {
            updatedDataTable.add(processOneLine(line, csvFile));
        }

}catch(Exception e) {
    log.error("Error", e);
}

El CSVReader tiene un pequeño conjunto de parámetros en el constructor que pueden definir las reglas de análisis, pero no puedo configurarlo de tal manera que pueda tolerar el problema que describí anteriormente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para manejar celdas de varias líneas con texto envuelto en un archivo CSV, debes configurar tu CSVReader para usar un CSVParser personalizado. El CSVParser es responsable de dividir una línea de texto en un arreglo de campos CSV.

    Una forma de manejar celdas de varias líneas es usar un CSVParser que ignore los saltos de línea dentro de los campos entre comillas. Puedes lograr esto creando un CSVParser personalizado utilizando la clase Builder proporcionada por la biblioteca opencsv, y estableciendo las opciones ignoreSurroundingSpaces e ignoreUnescapedQuotes en true:

    CSVParser parser = new CSVParserBuilder()
        .withSeparator(';')
        .withQuoteChar('"')
        .withIgnoreQuotations(true)
        .withIgnoreSurroundingSpaces(true)
        .withIgnoreUnescapedQuotes(true)
        .build();
    

    Luego, utiliza este parser personalizado al crear tu CSVReader:

    try(FileInputStream fio = new FileInputStream(csvFile);
            InputStreamReader isr =  new InputStreamReader(fio, StandardCharsets.UTF_8);
            CSVReader reader = new CSVReaderBuilder(isr)
                .withCSVParser(parser)
                .withSkipLines(1) // omitir encabezado
                .build()) {
    
        String[] line;
        while((line = reader.readNext()) != null) {
            updatedDataTable.add(processOneLine(line, csvFile));
        }
    } catch(Exception e) {
        log.error("Error", e);
    }
    

    Con esta configuración, el CSVReader debería analizar correctamente las celdas de varias líneas con texto envuelto en tu archivo CSV.

Comments are closed.