Pouvez-vous recommander une bibliothèque Java pour lire (et éventuellement écrire) des fichiers CSV? [fermé]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

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

J'ai aussi rencontré une autre question avec de bons liens: Java lib ou application pour convertir un fichier CSV en fichier XML?

Autres conseils

Le

Super CSV est un excellent choix pour la lecture / l'analyse, la validation et le mappage de fichiers CSV en fichiers POJO!

Nous (l'équipe de Super CSV) venons de publier une nouvelle version (vous pouvez télécharger le de SourceForge ou Maven).

Lecture d'un fichier CSV

L'exemple suivant utilise CsvDozerBeanReader (un nouveau lecteur que nous venons de publier et qui utilise Dozer pour la cartographie de beans avec cartographie approfondie et prise en charge de la cartographie basée sur des index) - basé sur l'exemple de notre site . Si vous n'avez pas besoin de la fonctionnalité Dozer (ou si vous voulez juste une dépendance autonome simple), vous pouvez utiliser CsvBeanReader à la place (voir ceci exemple de code ).

Exemple de fichier CSV

Voici un exemple de fichier CSV qui représente les réponses à une enquête. Il a un en-tête et 3 lignes de données, toutes 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

Définition du mappage de CSV vers POJO

Chaque ligne du fichier CSV sera lue dans un SurveyResponse classe, dont chacune contient une liste de Répondez s. Pour que le mappage fonctionne, vos classes doivent être des Javabeans valides (c’est-à-dire qu’elles ont un constructeur No-Arg par défaut et que des getters / setters sont définis pour chaque champ).

Dans Super CSV, vous définissez le mappage avec un tableau de chaînes simple. Chaque élément du tableau correspond à une colonne du fichier CSV.

Avec CsvDozerBeanMapper , vous pouvez utiliser:

  • mappages de champs simples (par exemple, prénom )

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

  • mappage indexé (par exemple, middleNames [1] - index de base zéro pour les tableaux ou les collections)

  • mappage profond + indexé (par exemple, personne.middleNames [1] )

Ci-dessous, le mappage de champs pour 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" };

Conversion et validation

Super CSV possède une bibliothèque utile de processeurs de cellules , qui peuvent être utilisés pour convertir les chaînes. du fichier CSV vers d’autres types de données (par exemple, Date, Integer) ou pour valider une contrainte (par exemple, obligatoire / facultatif, correspondance regex, vérification de la plage).

L'utilisation des processeurs de cellules est entièrement facultative . Sans eux, chaque colonne de CSV sera une chaîne, de sorte que chaque champ doit également être une chaîne.

Voici l'exemple de la configuration du processeur de cellule. Comme pour le mappage des champs, chaque élément du tableau représente une colonne CSV. Il montre comment les processeurs de cellules peuvent transformer les données CSV en types de données de votre champ et comment les chaîner ensemble.

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

Lecture

La lecture avec Super CSV est très flexible: vous fournissez votre propre Reader (vous pouvez ainsi lire à partir d'un fichier, le chemin de classe, un fichier zip, etc.), ainsi que le délimiteur et le caractère de citation sont configurables. via les préférences (parmi lesquelles un certain nombre de configurations prédéfinies conviennent à la plupart des utilisations).

Le code ci-dessous est assez explicite.

  1. Créez le lecteur (avec votre lecteur et vos préférences)

  2. (Facultatif) lisez l'en-tête

  3. Configurez le mappage de bean

  4. Continuez à appeler read () jusqu'à ce que vous obteniez un null (fin du fichier)

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

Résultat:

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 trouverez beaucoup plus d'informations sur le site Web !

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

Hé, j’ai un projet open-source pour cela: JFileHelpers . Je pense que le principal avantage est qu’il utilise les annotations Java. Jetez un coup d’œil:

Si vous avez ce haricot:

@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");

De plus, il prend en charge les détails principaux, la conversion de date et de format, et bien plus encore. Faites-moi savoir ce que vous pensez!

Cordialement!

Je trouve que Flatpack est vraiment efficace pour la gestion de fichiers CSV originaux (échappements, citations, mauvais enregistrements, etc.). etc.)

La question du fichier CSV au format XML posée précédemment semble répondre à toutes mes questions.

OpenCSV ( http://opencsv.sourceforge.net/ ) lie également les JavaBeans à l'aide d'un Stratégie de mappage des positions de colonne

  ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
  strat.setType(YourOrderBean.class);
  String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
  strat.setColumnMapping(columns);

  CsvToBean csv = new CsvToBean();
  List list = csv.parse(strat, yourReader);

JSEFA ( http://jsefa.sourceforge.net ) semble également faire tout ce dont j'ai besoin, en particulier liaison à des objets Java - en plus de la prise en charge de FLR et XML

J'ai réussi à analyser et à écrire des fichiers CSV à partir de Java avec OpenCSV . Si vous souhaitez lire ou écrire une feuille de calcul compatible avec Excel avec Java, la bibliothèque POI d'Apache est la voie à suivre. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top