API CSV pour Java [fermé]

164

Quelqu'un peut-il recommander une API simple qui me permettra d'utiliser la lecture d'un fichier d'entrée CSV, de faire quelques transformations simples, puis de 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 me coupler à cette API.

David Turner
la source
Utilisez le site sœur Software Recommendations Stack Exchange lorsque vous demandez des suggestions sur une bibliothèque de logiciels. A plusieurs hits pour Java et CSV .
Basil Bourque

Réponses:

32

Apache Commons CSV

Découvrez Apache Common CSV .

Cette bibliothèque lit et écrit plusieurs variantes de CSV , y compris la norme RFC 4180 . Lit / écrit également les fichiers délimités par des tabulations .

  • Exceller
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Oracle
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF
Basil Bourque
la source
J'ai utilisé le CSV Commons en bac à sable pendant un certain temps et je n'ai jamais rencontré de problème. J'espère vraiment qu'ils le promouvront pleinement et le sortiront du bac à sable.
Alex Marshall
3
@ bmatthews68 le lien du bac à sable est obsolète - on dirait qu'il a été déplacé vers apache commons proprement dit (j'ai également modifié le lien dans la réponse)
drevicko
Exemples Apache Commons ici: apisonar.com/java-examples/org.apache.commons.csv.html
APISonar
83

J'ai utilisé OpenCSV dans le passé.

import au.com.bytecode.opencsv.CSVReader;

String fileName = "data.csv";
Lecteur CSVReader = nouveau CSVReader (nouveau FileReader (fileName));

// si la première ligne est l'en-tête String [] header = reader.readNext ();
// itérer sur reader.readNext jusqu'à ce qu'il retourne null Chaîne [] ligne = reader.readNext ();

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

Jay R.
la source
Malheureusement, le dernier téléchargement d'OpenCSV (v2.2 au moment du commentaire) ne se compile pas et ne fournit pas de binaire pré-construit.
opyate
9
Le package que j'ai téléchargé de SourceForge avait un binaire dans le dossier de déploiement.
Mike Sickler
8
Si vous utilisez maven, veuillez noter que le code de dépendance sur le site officiel contient la déclaration de version "2.0" qui comporte quelques bogues, mais il existe une version 2.3 mise à jour dans les référentiels.
broundee
cette lib n'écrit pas de fichier dans un thread séparé, non?
Ewoks
3
selon github.com/uniVocity/csv-parsers-comparison en moyenne 73% plus lent que uniVocity ..
Ewoks
32

Mise à jour: le code de cette réponse est pour Super CSV 1.52. Des exemples de code mis à jour pour Super CSV 2.4.0 sont disponibles sur le site Web du projet: http://super-csv.github.io/super-csv/index.html


Le projet SuperCSV prend directement en charge l'analyse et la manipulation structurée des cellules CSV. Depuis 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 ensuite créer une instance de 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();
    }
  }
}

en 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
};
kbg
la source
1
Votre code ne se compilait pas, j'ai donc soumis quelques corrections. De plus, ParseDate () ne fonctionne pas correctement, je l'ai donc remplacé pour lire une chaîne. Il peut être analysé plus tard.
1
Grosse limitation: SuperCSV n'est pas threadsafe, je vais me tourner vers Jackson, bien qu'il soit peut-être plus limité en fonctionnalités
ZiglioUK
SuperCsv n'autorise pas non plus l'utilisation de multi-cartes. Ce serait bien de le voir fonctionner avec MultiMaps.
Sid
19

La lecture de la description du format CSV me donne l'impression que l'utilisation d'une bibliothèque tierce serait moins difficile que de l'écrire moi-même:

Wikipedia répertorie 10 bibliothèques ou quelque chose de connu:

J'ai comparé les bibliothèques listées 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)
moucheron
la source
8

Nous utilisons JavaCSV , cela fonctionne plutôt bien

Mat Mannion
la source
3
Le seul problème avec cette bibliothèque est qu'elle ne vous permettra pas de générer des fichiers CSV avec des terminateurs de ligne Windows ( \r\n) lorsqu'elle n'est pas exécutée sous Windows. L'auteur n'a pas fourni de soutien depuis des années. J'ai dû le fourcher
Mosty Mostacho
6

Pour la dernière application d'entreprise sur laquelle j'ai travaillé, il fallait gérer une quantité notable de CSV - il y a quelques mois - j'ai utilisé SuperCSV chez sourceforge et je l' ai trouvé simple, robuste et sans problème.

Cheekysoft
la source
+1 pour SuperCSV, mais il a quelques bugs désagréables qui ne sont pas encore corrigés, les nouveaux bogues ne sont pas traités actuellement, et la dernière version a presque deux ans. Mais nous utilisons une version corrigée / modifiée en production sans aucun problème.
MRalwasser
2
@MRalwasser Super CSV 2.0.0-beta-1 a récemment été publié. Il comprend de nombreuses corrections de bogues et de nouvelles fonctionnalités (y compris la prise en charge de Maven et une nouvelle extension Dozer pour le mappage des propriétés imbriquées et des tableaux / collections)
James Bassett
1
@ Hound-Dog Merci pour la mise à jour, j'ai déjà remarqué la nouvelle version bêta et je suis content de voir le projet en vie - même si la fréquence des commits me fait encore un peu peur (presque tous les commits sur quelques jours seulement). Mais je vais jeter un oeil. Y a-t-il une date de sortie estimée de la version 2.0 finale?
MRalwasser
2
@MRalwasser Je suis le seul développeur pour le moment et j'ai un travail à plein temps, donc j'ai tendance à travailler dessus chaque fois que j'ai un week-end gratuit - d'où les commits sporadiques :) Près de 1000 téléchargements SF de la bêta maintenant, et aucun bogue, donc à la recherche d'une version finale au début du mois prochain. Si vous avez des idées pour de futures fonctionnalités, veuillez nous en informer.
James Bassett
1
SuperCSV n'est pas threadsafe à ce stade, ce qui le rend pas vraiment robuste à mon humble avis
ZiglioUK
5

Vous pouvez utiliser csvreader api et 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/

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

    }
}
Dhananjay Joshi
la source
3

Il existe également un utilitaire CSV / Excel . Il suppose que toutes ces données ressemblent à une table et fournit des données à partir d'itérateurs.

Franc
la source
2

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

J'irais pour http://sourceforge.net/projects/javacsv

Paul
la source
0

Si vous avez l'intention de lire csv à partir d'Excel, alors il y a quelques cas de coin intéressants. 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 URL).

Assurez-vous de tester la sortie Excel avec des guillemets, des virgules et des barres obliques partout.

Daveb
la source
La bibliothèque Apache Commons CSV offre une variante spécifique pour Microsoft Excel . Je ne sais pas si cela règle maintenant les problèmes que vous mentionnez ou non.
Basil Bourque