Salut, J'ai jeté un oeil sur nuiton-csv, et je vais en profiter pour rajouter des tests unitaires et de la doc. J'ai pour le moment juste tester l'Import. Quelques retours jusque là : - Je ne suis pas fan du Iterator anonyme au milieu de la méthode startImport. Je pense qu'il serait plus intéressant de le sortir en méthode iterator() et du coup faire que Import implémente Iterable. - Ma première utilisation de Import fut de l'utiliser tel quel en implémentant les ImportableColumn. Je me suis aperçu qu'il y avait une implémentation par défaut très intéressante qui est Column. Du coup je me pose la question de l'interface. A priori les méthodes static proposés suffisent pour instancier correctement le Column suivant le besoin (import, export ou les deux). Je simplifierais donc bien en utilisant tout le temps Column. (cela enlèverait donc trois interfaces). - La solution de mandatory/ignored est un peu confuse. L'implémentation dans Column suppose que mandatory = !ignored, ce qui finalement se tient. On aura jamais les deux à true ou les deux à false. A moins que j'ai zappé un cas, je pense qu'il faut supprimer l'un des deux. - La notion de readFirstLine pourrait être paramètrable via le modèle. A moins que ce soit un pré-requis obligatoire que la première ligne soit les HEADERS. (Ce qui sera ajouter explicitement à la doc) - J'ai du mal avec la notion de start/stop. Je garderais plutôt l'idée de read/close plus explicite sur ce qui se cache derrière (un fichier). L'iterator se chargera du parcours. A noter que le validateCsv ne valide que les headers et non l'intégralité des données (ce qui serait débile mais peut porter à confusion). Utilisation actuelle : Import<Row> importRow = Import.newImport(rowModel, stream); try { Iterator<Row> iterator = importRow.startImport(); // validate headers, read first line and return iterator while (iterator.hasNext()) { Row row = iterator.next(); // treatment } } finally { importRow.stopImport(); } Utilisation possible : Import<Row> importRow = Import.newImport(rowModel, stream); try { importRow.readHeaders(); // validate headers and read first line for (Row row : importRow) { // using importRow as Iterable // treatment } } finally { importRow.close(); } Voilà pour le moment, je n'ai pas encore regarder le ModelBuilder. Je vais commiter mon test d'Import (avec Model et ImportableColumn anonymes, avec Model et Column) Une autre idée en passant : Est-ce que ce serait pas plus intéressant d'avoir le choix entre un rapport d'erreurs ou des exceptions dans le cas d'un problème rencontré sur une ligne ? A l'heure actuelle il faut catcher les exceptions une par une pour toutes les avoirs. Ce sera probablement intéressant dans un deuxième temps si le besoin s'en fait sentir.