API Java pour créer un object à partir d’un fichier CSV

Je recherche une bibliothèque qui me permette de mapper un contenu .csv sur un object.

Quelque chose comme:

public class Person { private Ssortingng name; private int age; @CsvField("name") public Ssortingng getName() { return this.name; } @CsvField("age") public int getAge() { return this.age; } } 

et ensuite dire quelque chose comme:

 final Person filledWithDataFromCsv = csvApi.load(csvFilepath, Person.class); 

à partir du CSV donné:

 #name, age tom, 11 jim, 32 

Est-ce que quelqu’un connaît une telle API, ou une API qui fait quelque chose de similaire? Je ne veux pas que les annotations soient obligatoires, je veux simplement pouvoir charger le fichier avec une ligne de code et une classe prédéfinie.

JSefa vous permet d’annoter les classes Java pouvant être utilisées dans un processus de sérialisation et de désérialisation. Le tutoriel montre comment cela fonctionne avec la classe CsvIOFactory.

(Extrait du didacticiel) Annoter un bean est aussi simple que de spécifier les emplacements des éléments dans la liste de valeurs et, si nécessaire, vous devrez spécifier le format de conversion:

 @CsvDataType() public class Person { @CsvField(pos = 1) Ssortingng name; @CsvField(pos = 2, format = "dd.MM.yyyy") Date birthDate; } 

Vous ne pouvez pas vous tromper avec les parsingurs uniVocity . Il prend en charge toutes sortes d’opérations puissantes et il est beaucoup plus rapide que tout autre parsingur CSV pour Java.

Voici une classe avec quelques exemples:

 class TestBean { // if the value parsed in the quantity column is "?" or "-", it will be replaced by null. @NullSsortingng(nulls = { "?", "-" }) // if a value resolves to null, it will be converted to the Ssortingng "0". @Parsed(defaultNullRead = "0") private Integer quantity; // The atsortingbute type defines which conversion will be executed when processing the value. @Trim @LowerCase // the value for the comments atsortingbute is in the column at index 4 (0 is the first column, so this means fifth column in the file) @Parsed(index = 4) private Ssortingng comments; // you can also explicitly give the name of a column in the file. @Parsed(field = "amount") private BigDecimal amount; @Trim @LowerCase // values "no", "n" and "null" will be converted to false; values "yes" and "y" will be converted to true @BooleanSsortingng(falseSsortingngs = { "no", "n", "null" }, trueSsortingngs = { "yes", "y" }) @Parsed private Boolean pending; } 

Voici comment obtenir une liste de TestBean

 BeanListProcessor rowProcessor = new BeanListProcessor(TestBean.class); CsvParserSettings parserSettings = new CsvParserSettings(); parserSettings.setRowProcessor(rowProcessor); parserSettings.setHeaderExtractionEnabled(true); CsvParser parser = new CsvParser(parserSettings); parser.parse(getReader("/examples/bean_test.csv")); List beans = rowProcessor.getBeans(); 

Divulgation: Je suis l’auteur de cette bibliothèque. C’est open-source et gratuit (licence Apache V2.0).

Je préfère opencsv , il est ultra simple et très propre.

http://opencsv.sourceforge.net/

Par exemple, lire:

 CSVReader reader = new CSVReader(new FileReader("yourfile.csv")); Ssortingng [] nextLine; while ((nextLine = reader.readNext()) != null) { // nextLine[] is an array of values from the line System.out.println(nextLine[0] + nextLine[1] + "etc..."); } 

Il existe de très bonnes implémentations JDBC pour CSV. Vous pouvez donc utiliser un tel pilote, configurer une source de données pour l’utiliser, puis utiliser JPA (ou autre) pour le mappage object-relationnel au-dessus de cette source de données.

la dernière version de https://github.com/arnaudroger/SimpleFlatMapper 0.9.4 a maintenant un CsvMapper. Il utilise l’en-tête pour faire correspondre le nom de la propriété ou, si aucun en-tête, vous pouvez spécifier le nom de la colonne via le générateur. Il supporte l’injection de constructeur, de setter et de champ. Lire depuis InputStream ou Reader. De plus, il ne gérerait pas le mappage de #nom à nommer. y a-t-il une raison pour laquelle il y a un # au début du csv?

 public class MyParser { private final CsvMapper mapper = CsvMapperFactory.newInstance().newMapper(MyObject.class); public void writeAllObjectToLambda(Writer writer, InputStream is) throws IOException { mapper.forEach(is, (o) -> writer.append(o.toSsortingng()).append("\n")); } }