IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Code JAVA pour import données CSV


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut Code JAVA pour import données CSV
    Bonjour à tous,

    J'ai un souci pour importer des données en format CSV (mon fichier fait plusieurs milliers de ligne de long sur une quinzaine de colonnes et y'a plein de caractères pourris dans certains des champs du genre ' - ; : , ...)

    Auriez vous des ressources concernant un bout de code qui fasse ça ligne par ligne, mais sans tomber dans le problème classique de se faire avoir avec les caractères spéciaux contenus dans une cellule et de prendre ça pour une nouvelle cellule en décalant tout.

    Je sais si pas j'ai été suffisamment clair mais je peux essayer d'éclaircir si on me demande. En fait je cherche un bout de code assez modulable.

    Merci de votre aide.

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Je comprends pas trop ton problème... Un fichier csv est sensé avoir 1 caractère de séparation (la virgule a priori) et basta ?

    Donc si tu te crées un flux de lecture qui va bien, avec des readline() pour choper chaque ligne et un stringtokenizer ayant pour séparateur la virgule, je vois pas en quoi les caractères spéciaux poseraient problème...

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    DevTeam_ : il y des cas ou tu souhaites inserer un champ contenant lui même une virgule. La stratégie est donc d'entourer ce champs avec des guillemets. Et de plus si ce champ entouré de guillement contient également des guillemets il faut les echapper. etc ..
    Le problème n'est pas difficile mais me semble plus complexe à résoudre quen utilisant un simple StringTokenizer

  4. #4
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Est-il possible dans ton cas d'utiliser un caractère de protection qui ne servirait qu'à ça (ex: ~), afin de signifier à ton appli Java que si une virgule est précédée de ce caractère alors ce n'est pas un séparateur ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 31
    Par défaut
    salut,

    essaye ce truc la http://opencsv.sourceforge.net/

    je l ai pas mal utilisé et ca marche plutot bien (surtout tu as le code source) ce qui te permet de le modifier en cas de besoin

    ++

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    package net.opencs.ads.ride.providers.form;
     
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.StringTokenizer;
     
    public class ImportFile {
     
        String data;
        String datas;
        String ligne;
     
        public ImportFile(String path) throws FileNotFoundException {
     
        // FileInputStream fis = new FileInputStream(datas);
        try {
     
            BufferedReader br = new BufferedReader(new FileReader(path));
     
            ligne=br.readLine();
            StringTokenizer st=new StringTokenizer(ligne, "|");
     
            while ((ligne = br.readLine()) != null) {
                while(st.hasMoreTokens())
     
                    System.out.println(st.nextToken());
            }
     
            System.out.println(st.countTokens());
            br.close();
     
        }
        catch (Exception e){
        e.printStackTrace();
        }
        }
     
    }
    Je pars d'un fichier Excel. J'en fais un export CSV avec l'excellent OpenOffice qui me permet de spécifier les caractères de séparation de champs (j'ai choisi | ) et les caractères avec lesquels je peux entourer chaque champ (j'ai choisi ~ ). Mais lorsque j'ai un champ vide, impossible de récupérer une valeur, même vide ni de l'exploiter.

    Exemple :
    La ligne en CSV ' ~1~|~2~||~4~

    me renvoie :
    1
    2
    4

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    N'utilise pas trop le StringTokenizer. Même si elle semble très utile, Sun conseille d'utiliser la méthode String#split().

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Attention. Ne pas oublier que la méthode split prend en argument une expression régulière donc dans ton cas il faudra faire un
    [code] ligne.split("\\|");

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Par défaut
    Effectivement le StringTokenizer est embetant et limité, la solution est venue avec le split :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while ((tmp=br.readLine())!=null ) {
    			String[] splitted=tmp.split("\\|");
    			for (int i=0;i<splitted.length;i++)
    				System.out.println(splitted[i]);
    		}
    Merci pour votre aide.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Bonjour, j'ai un souci à peu près similaire :
    Après m'être cassé les dents avec le stringTokenizer, je suis passé sur la méthode split...

    Seulement là, je me retrouve face à un autre problème du même genre, les champs de mon csv vide qui sont en fin de lignes sont ignorées, du coup, quand je parcours mon tableau, je me prend des ArrayOutOfBoundException....

    Mon code :

    Valeur de line :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RF|RF_JUNITTEST_NOUVEAU_1_DO||C|FATHER_JUNITTEST_INWORK_DO_1_DO|Pipe|52X|||
    Tableau résultat :
    [0] = RF
    [1] = RF_JUNITTEST_NOUVEAU_1_DO
    [2] =
    [3] = C
    [4] = FATHER_JUNITTEST_INWORK_DO_1_DO
    [5] = Pipe
    [6] = 52X

    Par contre, pas de trace des 3 champs de la fin (enfin que le troisième y soit pas, je peux comprendre, par contre, les autres....

    Du coup existe t'il une autre alternative??
    Dois je parcourir ma chaine à la main pour la découper moi même (ça m'ennui de devoir bricoler ce genre de truc moi même, normalement ça devrai exister)?
    Si je dois tester l'existence de ma cellule de tableau avant chaque lecture, ça va faire perdre de la lisibilité inutilement à mon code, vu que j'ai la garantie que mes lignes auront un nombre de champs fixes...

    Merci d'avance et à plus tard !

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Si tu connais le nombre de champs, donne-le en second paramètre :

    Dans ton cas :

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci beaucoup pour cette réponse rapide!
    J'ai modifié un peu ta solution (En fait sur chaque ligne de mon csv j'ai un nombre de champ fixe garanti, mais un nombre inconnu de champs facultatifs après le dernier champ obligatoire), ce qui donne :

    D'après la javadoc ( Enfin au moi d'après ce que j'ai compris, l'anglais et moi...), le pattern est appliqué autant de fois que possible, et les champs vides finaux ne sont pas tronqués, du coup c'est exactement ce qu'il me faut !

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/01/2012, 14h49
  2. Code VBA pour importer des données vers Excel
    Par thanmirt dans le forum SDK
    Réponses: 1
    Dernier message: 09/04/2011, 17h53
  3. problème pour importer données excel dans Access
    Par sarah67 dans le forum Access
    Réponses: 8
    Dernier message: 20/02/2006, 08h17
  4. [Fichier Texte] Est-ce utilisable pour importation données ?
    Par avantoux dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/12/2005, 17h55
  5. code java pour récupérer la valeur d'un neoud XML
    Par MASSAKA dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/10/2005, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo