API CSV pour Java [fermé]

est-ce que n'importe qui peut recommander une API simple qui me permettra d'utiliser lire un fichier D'entrée CSV, faire quelques transformations simples, puis l'écrire.

un rapide google a trouvé http://flatpack.sourceforge.net / qui semble prometteur.

je voulais juste vérifier ce que les autres utilisent avant de m'associer à cette API.

153
demandé sur CharlesB 2008-09-19 15:01:12

10 réponses

Apache Commons CSV

découvrez l'un des apache .

26
répondu Basil Bourque 2017-10-12 05:44:45

j'ai utilisé OpenCSV dans le passé.

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

il y avait d'autres choix dans les réponses à une autre question .

80
répondu Jay R. 2017-05-23 12:26:00

mise à jour: le code dans cette réponse est pour Super CSV 1.52. Des exemples de code mis à jour pour Super CSV 2.4.0 peuvent être trouvés sur le site Web du projet: http://super-csv.github.io/super-csv/index.html


le projet SuperCSV soutient directement l'analyse et la manipulation structurée des cellules CSV. De http://super-csv.github.io/super-csv/examples_reading.html vous trouverez par exemple

donné une classe

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

et que vous avez un fichier CSV avec un en-tête. Supposons le contenu suivant

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

vous pouvez alors créer une instance du UserBean et la remplir avec les valeurs de la deuxième ligne du fichier avec le code suivant

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

utilisant la "spécification de manipulation" suivante

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
};
32
répondu kbg 2016-04-23 04:32:10

Lire la description du format CSV me fait penser que l'utilisation d'une bibliothèque de tiers serait moins casse-tête que de l'écrire moi-même:

Wikipedia listes de 10 ou quelque chose de connu bibliothèques:

j'ai comparé les fichiers listés en utilisant une sorte de liste de contrôle. OpenCSV s'est avéré un gagnant pour moi (YMMV) avec les résultats suivants:

+ 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)
19
répondu gnat 2017-02-17 11:02:58

Nous utilisons des JavaCSV , cela fonctionne assez bien

8
répondu Mat Mannion 2008-09-19 11:06:56

pour la dernière application d'entreprise sur laquelle j'ai travaillé et qui devait traiter une quantité considérable de CSV -- il y a quelques mois -- j'ai utilisé SuperCSV chez sourceforge et je l'ai trouvé simple, robuste et sans problème.

6
répondu Cheekysoft 2008-09-19 11:21:08

vous pouvez utiliser l'api csvreader & télécharger à partir de l'emplacement suivant:

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

ou

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

utiliser le code suivant:

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

    }

}

écrire / ajouter au fichier CSV

Code

:

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

    }
}
5
répondu Dhananjay Joshi 2011-06-22 10:45:05

il y a aussi CSV/Excel Utility . Il suppose que toutes ces données sont de type table et fournit des données à partir D'itérateurs.

3
répondu Frank 2010-10-06 07:47:30

le format CSV semble assez facile pour StringTokenizer, mais il peut devenir plus compliqué. En Allemagne, un point-virgule est utilisé comme délimiteur et les cellules contenant des délimiteurs doivent être évitées. Vous n'allez pas gérer aussi facilement avec StringTokenizer.

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

2
répondu paul 2012-12-19 15:10:19

si vous avez l'intention de lire csv à partir d'excel, puis il ya quelques cas intéressants coin. Je ne me souviens pas de tous, mais le csv Apache commons n'était pas capable de le gérer correctement (avec, par exemple, des urls).

assurez-vous de tester la sortie excel avec des guillemets et des guillemets partout.

0
répondu daveb 2008-09-19 11:37:05