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.
davy.ai
Para manejar celdas de varias líneas con texto envuelto en un archivo CSV, debes configurar tu
CSVReader
para usar unCSVParser
personalizado. ElCSVParser
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 unCSVParser
personalizado utilizando la claseBuilder
proporcionada por la bibliotecaopencsv
, y estableciendo las opcionesignoreSurroundingSpaces
eignoreUnescapedQuotes
en true:Luego, utiliza este parser personalizado al crear tu
CSVReader
:Con esta configuración, el
CSVReader
debería analizar correctamente las celdas de varias líneas con texto envuelto en tu archivo CSV.