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.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 de FileReader 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 en Apache Commons IO:

    if (Files.isRegularFile(myPath)) {
        try (InputStream inputStream = new FileInputStream(myPath.toFile())) {
            BOMInputStream bomInputStream = new BOMInputStream(inputStream);
            bomInputStream.skipFully(bomInputStream.getBOM().length);
            final BufferedReader reader = new BufferedReader(new InputStreamReader(bomInputStream, StandardCharsets.UTF_8));
            final CSVParser parser = csvFormat.parse(reader);
            for (CSVRecord csvRecord : parser) {
                  String issuer = csvRecord.get("NOMBRE_DE_MI_COLUMN");
                  //código
            }
        } catch (IOException e) {
            //manejar excepción
        }
    }
    

    Este código utiliza BOMInputStream para omitir el BOM si está presente, luego crea un BufferedReader utilizando InputStreamReader con la codificación UTF-8. Después, analiza el CSV utilizando CSVParser como antes.

    Nota: Asegúrate de agregar la dependencia org.apache.commons.io en tu proyecto para utilizar BOMInputStream.

Comments are closed.