separado - ¿Puede recomendar una biblioteca Java para leer(y posiblemente escribir) archivos CSV?
manipular csv java (8)
Encuentro Flatpack para ser realmente bueno con el manejo de archivos CSV peculiares (escapes, citas, malos registros, etc.)
¿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)?
He tenido mucho éxito tanto en el análisis como en la escritura de archivos CSV desde Java con http://opencsv.sourceforge.net/ . Si desea leer o escribir hojas de cálculo compatibles con Excel con Java, la biblioteca POI de Apache es el camino a seguir.
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?
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
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<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
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!
Puedo recomendar SuperCSV . Fácil de usar e hizo todo lo que necesitaba.
Ver CVSBeans
SuperCSV 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 download 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 website . 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 Answer . 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 preferences (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.
Crea el lector (con tu
Reader
y tus preferencias)(Opcionalmente) lea el encabezado
Configure la asignación de beans
Siga llamando a
read()
hasta que obtenga unnull
(fin del archivo)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 SuperCSV !