2008-09-19 17 views
150

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

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

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

Respuesta

23

Apache Commons CSV

el registro de salida el de apache.

+0

He usado el CSV Commons de espacio aislado durante bastante tiempo y nunca he tenido problemas. Realmente espero que lo promuevan a su posición original y lo saquen de la caja de arena. –

+2

@ bmatthews68 el enlace de la caja de arena está desactivado - parece que se movió a [commons apache propiamente dicho] (http://commons.apache.org/proper/commons-csv/) (también edité el enlace en la respuesta) – drevicko

8

Utilizamos JavaCSV, funciona bastante bien

+3

El único problema con esta biblioteca es que no le permitirá dar salida a archivos CSV con terminaciones de línea de Windows ('\ r \ n') cuando no se ejecuta en Windows. El autor no ha brindado apoyo durante años. Tuve que bifurcarlo para permitir esa característica faltante: [JavaCSV 2.2] (https://github.com/pupi1985/JavaCSV-Reloaded) –

2

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

Yo iría por http://sourceforge.net/projects/javacsv

6

Para la última aplicación de empresa que trabajé en la que se necesita para manejar una cantidad notable de CSV - un par de meses atrás - Solía ​​SuperCSV en SourceForge y lo encontraron simple, robusto y sin problemas.

+0

+1 para SuperCSV, pero tiene algunos errores desagradables que aún no se han solucionado, nuevo los errores no se manejan actualmente, y la última versión tiene casi dos años. Pero estamos usando una versión parcheada/modificada en producción sin ningún problema. – MRalwasser

+2

@MRalwasser [Súper CSV 2.0.0-beta-1] (http://supercsv.sourceforge.net/release_notes.html) ha sido lanzado recientemente. Incluye muchas correcciones de errores y nuevas características (incluido el soporte de Maven y una nueva extensión Dozer para mapear propiedades anidadas y matrices/Colecciones) –

+1

@ Hound-Dog Gracias por la actualización, ya noté la nueva versión beta y estoy contento de ver el proyecto está vivo, aunque la frecuencia de los commits todavía me teme un poco (casi todos se comprometen en unos pocos días). Pero voy a echar un vistazo. ¿Hay una fecha estimada de lanzamiento del 2.0 final? – MRalwasser

0

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, comas y barras por todos lados.

80

He usado OpenCSV en el pasado.

import au.com.bytecode.opencsv.CSVReader;

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

// if the first line is the header String[] header = reader.readNext();
// iterate over reader.readNext until it returns null String[] line = reader.readNext();

hubo algunas otras opciones en las respuestas a another question.

+0

Desafortunadamente, La última descarga de OpenCSV (v2.2 en el momento del comentario) no se compila y no proporciona un binario preconstruido. – opyate

+9

El paquete que descargué de SourceForge tenía un binario en la carpeta de implementación. –

+8

Si usa maven, tenga en cuenta que el código de dependencia en el sitio web oficial contiene la declaración de la versión "2.0" que tiene algunos errores, pero hay una versión 2.3 actualizada en los repositorios. – broundee

32

Actualización: El código en esta respuesta es para Super CSV 1.52. ejemplos de códigos actualizadas para Super CSV 2.4.0 se pueden encontrar en la página web del proyecto: http://super-csv.github.io/super-csv/index.html


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

dado 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 una cabecera.Asumamos el siguiente contenido

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

continuación, puede crear una instancia de la UserBean y rellenarla 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(); 
    } 
    } 
} 

utilizando el 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 
}; 
+1

Tu código no se compila, así que envié algunas correcciones. Además, ParseDate() no funciona correctamente, así que lo reemplacé para leer un String. Puede ser analizado más tarde. –

+1

Gran limitación: SuperCSV no es seguro para los hilos, voy a buscar a Jackson, aunque puede que tenga más características limitadas – ZiglioUK

+0

SuperCsv tampoco permite el uso de multimaps. Sería bueno ver que funciona con MultiMaps. – Sid

3

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

5

Puede utilizar la API CSVReader & descarga del siguiente ubicación:

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

o

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

Utilice 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(); 
     } 

    } 

} 

Comentario/Anexar a 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(); 
     } 

    } 
} 
19

lectura CSV descripción del formato me hace sentir que el uso de la biblioteca tercera parte sería menos dolor de cabeza que escribir yo mismo:

Wikipedia enumera 10 o algo bibliotecas conocidas:

comparé libs enumeran utilizando algún tipo de lista de verificación. OpenCSV resultó un ganador para mí (tu caso es distinto) 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)