49 votes

Pouvez-vous recommander une bibliothèque Java pour la lecture (et éventuellement par écrit) des fichiers CSV?

Pouvez-vous recommander une bibliothèque Java pour la lecture, l'analyse, la validation et de la cartographie des lignes dans un valeurs séparées par des virgules (CSV) pour Java des objets de valeur (JavaBeans)?

37voto

Gary McWilliams Points 243

Nous avons utilisé http://opencsv.sourceforge.net/ avec un bon succès

Je suis aussi tombée sur une autre question avec de bons liens: http://stackoverflow.com/questions/123/csv-file-to-xml

23voto

Hound Dog Points 3240

Super CSV est un excellent choix pour la lecture/l'analyse, la validation et de la cartographie des fichiers CSV pour Pojo!

Nous (les Super CSV équipe) viennent de publier une nouvelle version (vous pouvez le télécharger à partir de SourceForge ou Maven).

La lecture d'un fichier CSV

L'exemple suivant utilise CsvDozerBeanReader (lecteur, nous venons qui utilise des Bulldozers pour bean avec cartographie profonde de la cartographie et de l'indice de base de la cartographie de soutien) - il est basé sur l'exemple de notre site web. Si vous n'avez pas besoin de le Bulldozer de la fonctionnalité (ou vous voulez juste une simple autonome de la dépendance), alors vous pouvez utiliser CsvBeanReader à la place (voir cet exemple de code).

Exemple de fichier CSV

Voici un exemple de fichier CSV qui représente les réponses à un sondage. Il a un en-tête et 3 lignes de données, le tout avec 8 colonnes.

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

La définition de la cartographie à partir de CSV à POJO

Chaque ligne du CSV va être lu dans un SurveyResponse classe, dont chacun a une Liste de Réponse. s. Pour la cartographie de travail, vos classes doit être valide Javabeans (j'.e ont une valeur par défaut no-arg constructeur et ont des getters/setters définies pour chaque champ).

Dans Super CSV vous définir la correspondance avec un simple tableau de chaînes - chaque élément du tableau correspond à une colonne dans le fichier CSV.

Avec CsvDozerBeanMapper vous pouvez utiliser:

  • simple mappages de champs (par exemple, firstName)

  • profonde mappages (par exemple, address.country.code)

  • indexé de cartographie (par exemple, middleNames[1] - index de base zéro pour les tableaux et les Collections)

  • profondeur + indexé de cartographie (par exemple, person.middleNames[1])

Voici le tableau de correspondance de cet exemple - il utilise une combinaison de ceux-ci:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

La Conversion et la Validation

Super CSV propose une bibliothèque de cellules processeurs, qui peut être utilisé pour convertir les Chaînes de caractères à partir du fichier CSV à d'autres types de données (par exemple, la Date, Entier), ou de faire de la contrainte de validation (par exemple, obligatoire/facultatif, l'expression rationnelle correspondant, le contrôle de la portée).

À l'aide de la cellule de processeurs est entièrement facultative , sans eux, chaque colonne de CSV sera une Chaîne de caractères, de sorte que chaque champ doit être une Chaîne aussi.

Ce qui suit est la cellule de la configuration du processeur pour l'exemple. Comme avec la cartographie sur le terrain, chaque élément du tableau représente une colonne CSV. Il montre comment la cellule processeurs peuvent transformer les données en CSV pour le type de données de votre domaine, et comment ils peuvent être enchaînés.

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

La lecture

Lecture avec Super CSV est très flexible: vous fournir votre propre Reader (de sorte que vous pouvez lire à partir d'un fichier, le chemin de la classe, un fichier zip, etc), et le séparateur et le caractère de devis sont configurables via les préférences (dont il existe un certain nombre de configurations prédéfinies qui s'adressent pour la plupart des usages).

Le code ci-dessous est assez explicite.

  1. Créer le lecteur (avec votre Reader et préférences)

  2. (En option) lire l'en-tête

  3. Configurer la fève de cartographie

  4. L'appel, read() jusqu'à ce que vous obtenez une null (fin de fichier)

  5. Fermer le lecteur

Code:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

Sortie:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

Plus D'Informations

Vous pouvez trouver beaucoup plus d'informations sur le site!

7voto

Domchi Points 3550

Je peux recommander SuperCSV. Simple à utiliser, et fait tout ce dont j'avais besoin.

4voto

kolrie Points 3496

Hey, j'ai un projet open-source pour que: JFileHelpers. Je pense que le principal avantage est qu'il utilise des Annotations Java, prendre un coup d'oeil:

Si vous avez ce bean:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;    
}

Et veut analyser ce fichier:

....|....1....|....2....|....3....|....4    			
1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF

Tout ce que vous avez à faire est ceci:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class);	
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

En outre, il prend en charge de maître-détail, la date et le format de conversion, et beaucoup plus. Laissez-moi savoir ce que vous en pensez!

En ce qui concerne meilleur!

3voto

ddimitrov Points 2005

Je trouve Flatpack être vraiment bon, à la manipulation de l'excentrique de fichiers CSV (escapades, des citations, des mauvais enregistrements, etc.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X