java - with - Char no válido entre el token encapsulado y el delimitador en la biblioteca CSV de Apache Commons
org apache commons csv write file (4)
Recibo el siguiente error al analizar el archivo CSV utilizando la biblioteca de Apache Commons CSV .
Exception in thread "main" java.io.IOException: (line 2) invalid char between encapsulated token and delimiter
at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:275)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:152)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:450)
at org.apache.commons.csv.CSVParser.getRecords(CSVParser.java:327)
at parse.csv.file.CSVFileParser.main(CSVFileParser.java:29)
¿Cuál es el significado de este error?
Encontré la solución al problema. Uno de mis archivos CSV tiene el siguiente atributo : "atributo con" comillas "anidadas"
Debido a una cita anidada en el atributo, el analizador falla.
Para evitar el problema anterior, evite las comillas anidadas de la siguiente manera: "atributo con las" "comillas" "" "anidadas
Esta es la única manera de resolver el problema.
Esa línea en el archivo CSV contiene un carácter no válido entre una de sus celdas y el final de la línea, el final del archivo o la siguiente celda. Una causa muy común de esto es no poder escapar de su carácter de encapsulación (el carácter que se utiliza para "envolver" cada celda, por lo que CSV sabe dónde comienza y termina una celda (token).
Nos topamos con este problema cuando teníamos una cita incrustada en nuestros datos.
0,"020"1,"BS:5252525 ORDER:99999"4
La solución aplicada fue CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);
La punta de @Cuga nos ayudó a resolver. Gracias @Cuga
El código completo es
public static void main(String[] args) throws IOException {
FileReader fileReader = null;
CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);
String fileName = "test.csv";
fileReader = new FileReader(fileName);
CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);
List<CSVRecord> csvRecords = csvFileParser.getRecords();
for (CSVRecord csvRecord : csvRecords) {
System.out.println(csvRecord);
}
csvFileParser.close();
}
El resultado es
CSVRecord [comment=null, mapping=null, recordNumber=1, values=[0, "020"1, "BS:5252525 ORDER:99999"4]]
Nos topamos con esto en este mismo error con datos que contienen citas en una entrada que no tiene comillas. Es decir:
some cell|this "cell" caused issues|other data
Fue difícil de encontrar, pero en los documentos de Apache , mencionan el método withQuote()
que puede tomar el valor null
.
Recibimos exactamente el mismo mensaje de error y esto (afortunadamente) terminó solucionando el problema para nosotros.