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)?
Réponses
Trop de publicités?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
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.
Créer le lecteur (avec votre
Reader
et préférences)(En option) lire l'en-tête
Configurer la fève de cartographie
L'appel,
read()
jusqu'à ce que vous obtenez unenull
(fin de fichier)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!
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!