¿Puede recomendar una biblioteca Java para leer (y posiblemente escribir) archivos CSV? [cerrado]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Puede recomendar una biblioteca Java para leer, analizar, validar y asignar filas en un archivo de valores separados por comas (CSV) a objetos de valor de Java (JavaBeans)?

¿Fue útil?

Solución

Hemos usado http://opencsv.sourceforge.net/ con buen éxito

También encontré otra pregunta con buenos enlaces: ¿Libra Java o aplicación para convertir archivos CSV a XML?

Otros consejos

Super CSV es una excelente opción para leer / analizar, validar y asignar archivos CSV a POJOs.

Nosotros (el equipo de Super CSV) acabamos de lanzar una nueva versión (puede descargar de SourceForge o Maven).

Leyendo un archivo CSV

El siguiente ejemplo usa CsvDozerBeanReader (un nuevo lector que acabamos de lanzar que usa Dozer para el mapeo de beans con mapeo profundo y soporte de mapeo basado en índices): se basa en el ejemplo de nuestro sitio web . Si no necesita la funcionalidad de Dozer (o si solo desea una dependencia independiente simple), puede usar CsvBeanReader (consulte esto ejemplo de código ).

Ejemplo de archivo CSV

Aquí hay un ejemplo de archivo CSV que representa las respuestas a una encuesta. Tiene un encabezado y 3 filas de datos, todas con 8 columnas.

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

Definiendo la asignación de CSV a POJO

Cada fila de CSV se leerá en un SurveyResponse clase, cada una de las cuales tiene una Lista de Responda s. Para que la asignación funcione, sus clases deben ser Javabeans válidos (es decir, tener un constructor sin argumentos predeterminado y tener definidores / definidores definidos para cada campo).

En Super CSV, define la asignación con una matriz String simple: cada elemento de la matriz corresponde a una columna en el archivo CSV.

Con CsvDozerBeanMapper puede usar:

  • asignaciones de campo simple (por ejemplo, firstName)

  • asignaciones profundas (por ejemplo, address.country.code)

  • asignación indexada (por ejemplo, middleNames [1] - índice basado en cero para matrices o colecciones)

  • mapeo profundo + indexado (por ejemplo, person.middleNames[1?)

La siguiente es la asignación de campo para este ejemplo: utiliza una combinación de estos:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

Conversión y validación

Super CSV tiene una biblioteca útil de procesadores celulares , que se pueden usar para convertir las cadenas desde el archivo CSV a otros tipos de datos (por ejemplo, Fecha, Integer), o para realizar la validación de restricciones (por ejemplo, obligatorio / opcional, coincidencia de expresiones regulares, verificación de rango).

El uso de procesadores celulares es completamente opcional ; sin ellos, cada columna de CSV será una cadena, por lo que cada campo también debe ser una cadena.

La siguiente es la configuración del procesador de células para el ejemplo. Al igual que con la asignación de campos, cada elemento de la matriz representa una columna CSV. Demuestra cómo los procesadores celulares pueden transformar los datos CSV en el tipo de datos de su campo y cómo se pueden encadenar juntos.

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

Leyendo

Leer con Super CSV es muy flexible: usted suministra su propio Reader (para que pueda leer desde un archivo, el classpath, un archivo zip, etc.), y el delimitador y el carácter de comillas son configurables a través de preferencias (de las cuales hay una serie de configuraciones predefinidas que se adaptan a la mayoría de los usos).

El siguiente código es bastante autoexplicativo.

  1. Cree el lector (con su Reader y sus preferencias)

  2. (opcionalmente) lee el encabezado

  3. Configure la asignación de bean

  4. Siga llamando a read () hasta que obtenga un null (final del archivo)

  5. Cerrar el lector

Código:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

Output:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

Más información

¡Puede encontrar mucha más información en el sitio web !

Puedo recomendar SuperCSV . Fácil de usar, e hice todo lo que necesitaba.

Hola, tengo un proyecto de código abierto para eso: JFileHelpers . Creo que la principal ventaja es que utiliza Anotaciones de Java, eche un vistazo:

Si tienes este bean:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;    
}

Y quiere analizar este archivo:

....|....1....|....2....|....3....|....4                
1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF      

Todo lo que tienes que hacer es esto:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

Además, admite detalles maestros, conversión de fecha y formato, y mucho más. Déjame saber lo que piensas!

¡Saludos!

Creo que Flatpack es realmente bueno para manejar archivos CSV extravagantes (escapes, citas, malos registros, etc.)

La pregunta del archivo CSV a XML que se hizo anteriormente parece responder a todas mis preguntas.

OpenCSV ( http://opencsv.sourceforge.net/ ) también se vincula a JavaBeans utilizando un Estrategia de mapeo de posición de columna

  ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
  strat.setType(YourOrderBean.class);
  String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
  strat.setColumnMapping(columns);

  CsvToBean csv = new CsvToBean();
  List list = csv.parse(strat, yourReader);

JSEFA ( http://jsefa.sourceforge.net ) también parece hacer todo lo que necesito, especialmente vinculante a objetos Java, además de admitir FLR y XML

He tenido mucho éxito al analizar y escribir archivos CSV desde Java con OpenCSV . Si desea leer o escribir una hoja de cálculo compatible con Excel con Java, la biblioteca POI de Apache es el camino a seguir. .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top