Pregunta

¿Alguien puede recomendar una API sencilla que me permita leer un archivo CSV archivo de entrada, hacer algunas transformaciones simples y, a continuación, escribir.

Una rápida en google ha encontrado http://flatpack.sourceforge.net/ que parece prometedor.

Sólo quería comprobar lo que otros están usando antes de que yo par a mí mismo a esta API.

¿Fue útil?

Solución

Apache Commons CSV

Echa un vistazo Apache Común CSV.

Esta biblioteca se lee y se escribe varias variaciones de CSV, incluyendo el estándar de un RFC 4180.También lee/escribe Delimitado por tabuladores los archivos.

  • Excel
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Oracle
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF

Otros consejos

He usado OpenCSV en el pasado.

import au.com.bytecode.opencsv.CSVReader;

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

// si la primera línea es el encabezado String[] header = lector.readNext();
// iterar sobre el lector.readNext hasta que se devuelve null String[] palabras = lector.readNext();

Hay algunas otras opciones en las respuestas a otra pregunta.

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


El SuperCSV proyecto apoya directamente el análisis estructurado y manipulación de CSV células.De 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 la UserBean y rellenar 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();
    }
  }
}

mediante el siguiente "manipulación" especificación de los

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
};

La lectura de formato CSV descripción me hace sentir que el uso de la 3ª parte de la biblioteca sería menos dolores de cabeza que escribir yo mismo:

Listas de Wikipedia 10 o algo que se conoce en las bibliotecas:

He comparado libs se enumeran utilizando algún tipo de lista de verificación. OpenCSV resultó 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)

Utilizamos JavaCSV, funciona bastante bien

Para la última aplicación de empresa que he trabajado en los que se necesita para manejar una cantidad notable de CSV-hace un par de meses ... he usado SuperCSV en sourceforge y resultó sencillo, robusto y libre de problemas.

Usted puede utilizar csvreader api 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/

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

    }

}

Escribir / Anexar a un 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 Utilidad.Se supone que todos esos datos es un cuadro y entrega de datos a partir de los Iteradores.

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

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

Si usted tiene la intención de leer csv de excel, a continuación, hay algunos interesantes casos de esquina.Yo no recuerdo todos, pero el apache commons csv no era capaz de manejar correctamente (con, por ejemplo, las direcciones url).

Asegúrese de probar la salida de excel con citas y comas y barras de todo el lugar.

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