Lecture de fichier CSV à structure non fixes
(second repost) Bonjour, Peut-on, avec nuiton-csv lire des fichiers: - où la casse des entêtes peut bouger - où certaines colonnes sont optionnelles - où certaines colonnes peuvent avoir deux(ou plusieurs) noms ? Concrètement, dans certains fichiers j'ai: "cout total", et dans d'autre j'ai "cout total AVEC carburant" et "cout total SANS carburant" "cout total SANS carburant" est optionnelle, "cout total" = "cout total AVEC carburant" -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
On Thu, 18 Jul 2013 10:13:27 +0200 Eric Chatellier <chatellier@codelutin.com> wrote:
(second repost) scond post tu veux dire ou repost ;)
Bonjour,
Peut-on, avec nuiton-csv lire des fichiers: - où la casse des entêtes peut bouger
- où certaines colonnes sont optionnelles
1) j'ai déjà fait ça mais je ne sais plus trop où, il faut que je recherche, mais globalement, tu peux aussi utiliser la méthode décrite dans le 3) 2) oui cela est déjà possible, via la méthode org.nuiton.util.csv.ImportableColumn#isIgnored()
- où certaines colonnes peuvent avoir deux(ou plusieurs) noms ?
Concrètement, dans certains fichiers j'ai: "cout total", et dans d'autre j'ai "cout total AVEC carburant" et "cout total SANS carburant" "cout total SANS carburant" est optionnelle, "cout total" = "cout total AVEC carburant"
3) Si je comprends bien, tu ne sais pas à l'avance si la colonne sera cout totale ou cout totale AVEC carburant ? Si tel est le cas tu peux t'en sortir : la méthode org.nuiton.util.csv.ImportModel#pushCsvHeaderNames te retourne la liste des colonnes trouvées dans l'entête du fichier csv, à toi ensuite de construire le modèle csv d'import qui va bien. En conclusion si tu finalises la construction de ton modèle d'import (a.k.a fait les ajustement qui vont bien) après le passage dans la méthode pushCsvHeaderNames tu dois pouvoir gérer tous les cas un peu flottant de ton fichier entrant. Est-ce que cela te convient (/ suffit) ? Cela serait la bonne occasion d'étoffer un peu la documentation (très maigre) de ce projet. Si tu le veux bien, je te suggère d'y ajouter ces cas d'utilisations et on pourra (ensemble?) y mettre le code qui va bien pour répondre à ton besoin. tony.
On Thu, 18 Jul 2013 10:22:33 +0200 Tony Chemit <chemit@codelutin.com> wrote: > On Thu, 18 Jul 2013 10:13:27 +0200 > Eric Chatellier <chatellier@codelutin.com> wrote: > > > (second repost) > scond post tu veux dire ou repost ;) > > > > > Bonjour, > > > > Peut-on, avec nuiton-csv lire des fichiers: > > - où la casse des entêtes peut bouger > > 1) > j'ai déjà fait ça mais je ne sais plus trop où, il faut que je recherche, mais globalement, tu peux aussi utiliser la méthode décrite dans le 3) > > > - où certaines colonnes sont optionnelles > 2) > oui cela est déjà possible, via la méthode org.nuiton.util.csv.ImportableColumn#isIgnored() plutot utiliser org.nuiton.util.csv.ImportableColumn#isMandatory() à false, ignored ne sera jamais traité. tony.
Le 18/07/2013 10:22, Tony Chemit a écrit :
3) Si je comprends bien, tu ne sais pas à l'avance si la colonne sera cout totale ou cout totale AVEC carburant ?
Si tel est le cas tu peux t'en sortir : la méthode org.nuiton.util.csv.ImportModel#pushCsvHeaderNames te retourne la liste des colonnes trouvées dans l'entête du fichier csv, à toi ensuite de construire le modèle csv d'import qui va bien.
En conclusion si tu finalises la construction de ton modèle d'import (a.k.a fait les ajustement qui vont bien) après le passage dans la méthode pushCsvHeaderNames tu dois pouvoir gérer tous les cas un peu flottant de ton fichier entrant.
Est-ce que cela te convient (/ suffit) ?
Je n'ai pas compris, pushCsvHeaderNames prend une liste mais ne retourne rien. Je ne comprend même pas comment ca pourra fonctionner au final, car il devrait dire que les colonnes ne sont pas celle attendu avant même que je puisse les lire... -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
On 18/07/2013 10:44, Eric Chatellier wrote:
Le 18/07/2013 10:22, Tony Chemit a écrit :
3) Si je comprends bien, tu ne sais pas à l'avance si la colonne sera cout totale ou cout totale AVEC carburant ?
Si tel est le cas tu peux t'en sortir : la méthode org.nuiton.util.csv.ImportModel#pushCsvHeaderNames te retourne la liste des colonnes trouvées dans l'entête du fichier csv, à toi ensuite de construire le modèle csv d'import qui va bien.
En conclusion si tu finalises la construction de ton modèle d'import (a.k.a fait les ajustement qui vont bien) après le passage dans la méthode pushCsvHeaderNames tu dois pouvoir gérer tous les cas un peu flottant de ton fichier entrant.
Est-ce que cela te convient (/ suffit) ?
Je n'ai pas compris, pushCsvHeaderNames prend une liste mais ne retourne rien. Je ne comprend même pas comment ca pourra fonctionner au final, car il devrait dire que les colonnes ne sont pas celle attendu avant même que je puisse les lire...
Et si tu mets les 2 colonnes "cout totale" et "cout totale AVEC carburant" optionnelles et que tu checks qu'il y en a bien au moins une des 2 ça devrait le faire non ? Kevin
Le 18/07/2013 10:51, Kevin Morin a écrit :
Et si tu mets les 2 colonnes "cout totale" et "cout totale AVEC carburant" optionnelles et que tu checks qu'il y en a bien au moins une des 2 ça devrait le faire non ? En fait les colonnes sont définies de manière obligatoire si après la lecture des entêtes, les champs sont présents dans la liste des entêtes.
En gros dans le code du modèle d'import: public void pushCsvHeaderNames(List<String> headerNames) { super.pushCsvHeaderNames(headerNames); if (headerNames.contains("coût total")) { newMandatoryColumn("coût total", Entity.PROPERTY_COUT_TOTAL_AVEC_CARBURANT); } else { newMandatoryColumn("coût total AVEC CARBURANT", Entity.PROPERTY_COUT_TOTAL_AVEC_CARBURANT); newMandatoryColumn("coût total SANS CARBURANT", Entity.PROPERTY_COUT_TOTAL_SANS_CARBURANT); } [...] } -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com
participants (3)
-
Eric Chatellier -
Kevin Morin -
Tony Chemit