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

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

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

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

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

Nosotros (el equipo Super CSV) acabamos de lanzar una nueva versión (puedes descargarla desde SourceForge o Maven).

Leyendo un archivo CSV

El siguiente ejemplo utiliza CsvDozerBeanReader (un nuevo lector que acabamos de lanzar que utiliza Dozer para mapeo de bean con mapeo profundo y soporte de mapeo basado en índices) – se basa en el ejemplo de nuestro sitio web . Si no necesita la funcionalidad Dozer (o simplemente desea una dependencia independiente simple), entonces puede usar CsvBeanReader en CsvBeanReader lugar (vea este ejemplo de código ).

Ejemplo de archivo CSV

Aquí hay un archivo CSV de ejemplo que representa las respuestas a una encuesta. Tiene un encabezado y 3 filas de datos, todos 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 

Definir el mapeo de CSV a POJO

Cada fila de CSV se leerá en una clase SurveyResponse , cada una de las cuales tiene una lista de respuestas . Para que la asignación funcione, tus clases deben ser Javabeans válidas (es decir, tener un constructor no arg por defecto y tener getters / setters 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 puedes usar:

  • asignaciones de campo simples (por ejemplo, firstName )

  • mapeos profundos (ej. address.country.code )

  • mapeo indexado (por ejemplo, middleNames[1] – índice basado en cero para matrices o colecciones)

  • mapeo profundo + indexado (ej. person.middleNames[1] )

El siguiente es el mapeo de campo para este ejemplo: usa 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 de celdas , que se pueden usar para convertir las cadenas del archivo CSV a otros tipos de datos (por ejemplo, fecha, entero) o validación de restricciones (por ejemplo, obligatorio / opcional, correspondencia de expresiones regulares, comprobación de rango) .

El uso de procesadores de celda 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 celular para el ejemplo. Al igual que con el mapeo de campo, cada elemento en el conjunto representa una columna CSV. Demuestra cómo los procesadores de células pueden transformar los datos de CSV al tipo de datos de su campo y cómo pueden encadenarse entre sí.

 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 de un archivo, el classpath, un archivo zip, etc.), y el delimitador y el carácter de cita se pueden configurar 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 auto explicativo.

  1. Crea el lector (con tu Reader y tus preferencias)

  2. (Opcionalmente) lea el encabezado

  3. Configure la asignación de beans

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

  5. Cierre 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(); } } 

Salida:

 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 hizo todo lo que necesitaba.

Oye, tengo un proyecto de código abierto para eso: JFileHelpers . Creo que la principal ventaja es que usa anotaciones de Java, eche un vistazo:

Si tienes este frijol:

 @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 engine = new FileHelperEngine(Customer.class); List customers = new ArrayList(); customers = engine.readResource( "/samples/customers-fixed.txt"); 

Además, admite la conversión de detalles maestros, fechas y formatos, y mucho más. ¡Déjame saber lo que piensas!

¡Atentamente!

Encuentro Flatpack para ser realmente bueno con el manejo de archivos CSV peculiares (escapes, citas, malos registros, etc.)

La pregunta CSV File to XML que se hizo anteriormente parece responder a todas mis preguntas.

OpenCSV ( http://opencsv.sourceforge.net/ ) también vincula a JavaBeans utilizando una estrategia de asignación de posición de columnas

  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, particularmente vinculante para objetos Java, además de soportar FLR y XML

He tenido mucho éxito tanto en el análisis como en la escritura de archivos CSV desde Java con OpenCSV . Si desea leer o escribir hojas de cálculo compatibles con Excel con Java, la biblioteca POI de Apache es el camino a seguir.

Ver CVSBeans