Parser de Apache commons para leer un archivo CSV con BOM
Tengo algo así..
final CSVFormat csvFormat = CSVFormat.RFC4180.builder()
.setHeader()
.setSkipHeaderRecord(true)
.setIgnoreHeaderCase(true)
.setDelimiter('|')
.build();
if (Files.isRegularFile(myPath)) {
try (
final BufferedReader reader = new BufferedReader(new FileReader(myPath.toFile()));
final CSVParser parser = csvFormat.parse(reader);) {
for (CSVRecord csvRecord : parser) {
String issuer = csvRecord.get("NOMBRE_DE_MI_COLUMNA");
//some code
}
}
}
Todo es perfecto cuando leo algunos archivos sin BOM,
pero no cuando quiero leer algunos archivos con BOM.
Obtengo un error, como:
java.lang.IllegalArgumentException: No se encontró mapeo para "NOMBRE_DE_MI_COLUMNA", se esperaba uno de..
De hecho, cuando “NOMBRE_DE_MI_COLUMNA” es la primera columna del archivo y el archivo tiene BOM, el parser de Apache no quiere leer el archivo.
¿Alguien tiene alguna idea?
davy.ai
Parece que el problema está en la presencia de la marca de orden de bytes (BOM, por sus siglas en inglés) en el archivo CSV. La BOM es una secuencia de bytes al comienzo de un archivo de texto que indica el tipo de codificación del archivo. Algunos analizadores de CSV tienen problemas al leer archivos con BOM.
Para solucionar este problema, puedes intentar usar un lector diferente que pueda manejar BOM. Por ejemplo, puedes utilizar
InputStreamReader
en lugar deFileReader
y especificar el tipo de codificación del archivo. También puedes verificar si el archivo tiene un BOM y omitirlo manualmente antes de analizar el archivo CSV.Aquí tienes un ejemplo de cómo omitir el BOM utilizando
BOMInputStream
, disponible enApache Commons IO
:Este código utiliza
BOMInputStream
para omitir el BOM si está presente, luego crea unBufferedReader
utilizandoInputStreamReader
con la codificación UTF-8. Después, analiza el CSV utilizandoCSVParser
como antes.Nota: Asegúrate de agregar la dependencia
org.apache.commons.io
en tu proyecto para utilizarBOMInputStream
.