CSV API para Java

¿Alguien puede recomendar una API simple que me permita usar leer un archivo de entrada CSV, hacer algunas transformaciones simples y luego escribirlo?

Un rápido google ha encontrado http://flatpack.sourceforge.net/ que parece prometedor.

Solo quería comprobar lo que otros están usando antes de unirme a esta API.

CSV Apache Commons

mira el de apache .

He usado OpenCSV en el pasado.

import au.com.bytecode.opencsv.CSVReader; 

  String fileName = "data.csv";
 CSVReader reader = nuevo CSVReader (nuevo FileReader (fileName)); 

// si la primera línea es el encabezado String [] header = reader.readNext ();
// iterar sobre reader.readNext hasta que devuelva null String [] line = reader.readNext ();

Hubo algunas otras opciones en las respuestas a otra pregunta .

Actualización: el código en esta respuesta es para Super CSV 1.52. Se pueden encontrar ejemplos de códigos actualizados para Super CSV 2.4.0 en el sitio web del proyecto: http://super-csv.github.io/super-csv/index.html


El proyecto SuperCSV admite directamente el análisis y la manipulación estructurada de células CSV. Desde http://super-csv.github.io/super-csv/examples_reading.html encontrarás, por ejemplo,

dada una clase

 public class UserBean { String username, password, street, town; int zip; public String getPassword() { return password; } public String getStreet() { return street; } public String getTown() { return town; } public String getUsername() { return username; } public int getZip() { return zip; } public void setPassword(String password) { this.password = password; } public void setStreet(String street) { this.street = street; } public void setTown(String town) { this.town = town; } public void setUsername(String username) { this.username = username; } public void setZip(int zip) { this.zip = zip; } } 

y que tiene un archivo CSV con un encabezado. Supongamos el siguiente contenido

 username, password, date, zip, town Klaus, qwexyKiks, 17/1/2007, 1111, New York Oufu, bobilop, 10/10/2007, 4555, New York 

A continuación, puede crear una instancia de UserBean y completarla con los valores de la segunda línea del archivo con el siguiente código

 class ReadingObjects { public static void main(String[] args) throws Exception{ ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE); try { final String[] header = inFile.getCSVHeader(true); UserBean user; while( (user = inFile.read(UserBean.class, header, processors)) != null) { System.out.println(user.getZip()); } } finally { inFile.close(); } } } 

usando la siguiente “especificación de manipulación”

 final CellProcessor[] processors = new CellProcessor[] { new Unique(new StrMinMax(5, 20)), new StrMinMax(8, 35), new ParseDate("dd/MM/yyyy"), new Optional(new ParseInt()), null }; 

Leer la descripción del formato CSV me hace sentir que usar una biblioteca de terceros sería menos dolor de cabeza que escribirlo yo mismo:

Wikipedia enumera 10 o algunas bibliotecas conocidas:

Comparé las librerías enumeradas usando algún tipo de lista de verificación. OpenCSV resultó ser un ganador para mí (YMMV) con los siguientes resultados:

 + maven + maven - release version // had some cryptic issues at _Hudson_ with snapshot references => prefer to be on a safe side + code examples + open source // as in "can hack myself if needed" + understandable javadoc // as opposed to eg javadocs of _genjava gj-csv_ + compact API // YAGNI (note *flatpack* seems to have much richer API than OpenCSV) - reference to specification used // I really like it when people can explain what they're doing - reference to _RFC 4180_ support // would qualify as simplest form of specification to me - releases changelog // absence is quite a pity, given how simple it'd be to get with maven-changes-plugin // _flatpack_, for comparison, has quite helpful changelog + bug tracking + active // as in "can submit a bug and expect a fixed release soon" + positive feedback // Recommended By 51 users at sourceforge (as of now) 

Usamos JavaCSV , funciona bastante bien

Para la última aplicación empresarial en la que trabajé que necesitaba manejar una notable cantidad de CSV, hace un par de meses, utilicé SuperCSV en sourceforge y me pareció simple, robusto y sin problemas.

Puede usar la aplicación csvreader y descargar desde la siguiente ubicación:

http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.zip/download

o

http://sourceforge.net/projects/javacsv/

Usa el siguiente código:

 / ************ For Reading ***************/ import java.io.FileNotFoundException; import java.io.IOException; import com.csvreader.CsvReader; public class CsvReaderExample { public static void main(String[] args) { try { CsvReader products = new CsvReader("products.csv"); products.readHeaders(); while (products.readRecord()) { String productID = products.get("ProductID"); String productName = products.get("ProductName"); String supplierID = products.get("SupplierID"); String categoryID = products.get("CategoryID"); String quantityPerUnit = products.get("QuantityPerUnit"); String unitPrice = products.get("UnitPrice"); String unitsInStock = products.get("UnitsInStock"); String unitsOnOrder = products.get("UnitsOnOrder"); String reorderLevel = products.get("ReorderLevel"); String discontinued = products.get("Discontinued"); // perform program logic here System.out.println(productID + ":" + productName); } products.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

Escribir / Anexar al archivo CSV

Código:

 /************* For Writing ***************************/ import java.io.File; import java.io.FileWriter; import java.io.IOException; import com.csvreader.CsvWriter; public class CsvWriterAppendExample { public static void main(String[] args) { String outputFile = "users.csv"; // before we open the file check to see if it already exists boolean alreadyExists = new File(outputFile).exists(); try { // use FileWriter constructor that specifies open for appending CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ','); // if the file didn't already exist then we need to write out the header line if (!alreadyExists) { csvOutput.write("id"); csvOutput.write("name"); csvOutput.endRecord(); } // else assume that the file already has the correct header line // write out a few records csvOutput.write("1"); csvOutput.write("Bruce"); csvOutput.endRecord(); csvOutput.write("2"); csvOutput.write("John"); csvOutput.endRecord(); csvOutput.close(); } catch (IOException e) { e.printStackTrace(); } } } 

También hay CSV / Excel Utility . Asume que todos estos datos son de tipo tabla y entregan datos de Iteradores.

El formato CSV parece bastante fácil para StringTokenizer, pero puede volverse más complicado. Aquí en Alemania, un punto y coma se usa como delimitador y las celdas que contienen delimitadores deben escaparse. No vas a manejar eso fácilmente con StringTokenizer.

Me gustaría ir a http://sourceforge.net/projects/javacsv

Si tiene la intención de leer csv de excel, entonces hay algunos casos de esquina interesantes. No puedo recordarlos a todos, pero apache commons csv no era capaz de manejarlo correctamente (con, por ejemplo, URL).

Asegúrese de probar la salida de Excel con comillas y comas y barras por todos lados.