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

Entrée/Sortie Java Discussion :

Lecture d'un fichier et encodage


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut Lecture d'un fichier et encodage
    Bonjour,

    Voici mon problème:

    J'essaye de lire un ficher (CSV) grâce à un BufferedReader. J'ai une code qui ressemble à ça
    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
     
    public void Read(String filePath){
    try{
    InputStream ips = new FileInputStream(filePath);
    InputStreamReader ipsr = new InputStreamReader(ips, "ISO-8859-15");
    BufferedReader br = new BufferedReader(ipsr);
    String ligne;
     
    while((ligne = br.readLine()) != null){
    ligne = ligne.replaceAll(",", ".");
    tempOut.add(ligne);
    }
     
    br.close();
    ipsr.close();
    ips.close();
    } catch (Exception .....
    Sachant que tempOut est une List<String>.

    Cette fonction a très bien marché sur un de mes fichiers, mais ne marche pas du tout sur un autre. Pour info, mes deux fichiers commence comme ça

    Celui là marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DT_IMPCAR;R_MS_ADRPRI;R_MS_ADRDEP;MS_SSCC;R_MS_SSCCPR;R_MS_CPTRMI;R_MS_STMISS;UL_DONORD;UL_CPROIN;UL_ILOGIS;R_MS_UVCDEP;R_MS_DAFIFO;R_MS_UVCREI;R_MS_CODCAR;R_MS_CPTRPI;R_MS_TYPEMI;R_MS_UVCDEP2;HAUT_CAL_PALETTE
    2012-02-02 00:00:00.000;01R03;01C380063C;30201101046862400;NULL;0;5;35014;647426;1;700;2013-02-12 00:00:00.000;0;209;0;0;700;122,999996
    2012-02-02 00:00:00.000;01E050622B;01E050820N;30000000209136700;NULL;A;5;35014;766866;0;450;2012-01-27 08:41:15.000;18;211;0;2;450;102
    2012-02-02 00:00:00.000;01E050820N;01E040822B;30000000209136700;NULL;0;5;35014;766866;0;432;2012-02-02 00:00:00.000;0;211;0;3;432;102
    2012-02-02 00:00:00.000;01L010871C;01C380080A;350100498881220000;NULL;0;5;35014;939070;1;576;2012-01-06 09:33:05.000;0;419;0;2;576;96
    2012-02-02 00:00:00.000;01C320241C;01C320260A;133955000016443000;NULL;A;5;35014;99191;15;648;2011-12-02 08:34:27.000;270;46;0;2;648;154,4
    2012-02-02 00:00:00.000;01C320260A;01C320261C;133955000016443000;NULL;0;5;35014;99191;15;378;2012-02-02 00:00:00.000;0;46;0;3;378;115,8
    2012-02-02 00:00:00.000;01D050260A;01D040251B;30201101046664600;NULL;0;5;35014;894959;3;672;2012-02-02 00:00:00.000;0;211;0;3;672;78
    2012-02-02 00:00:00.000;01D040251B;01D050260A;30201101046664600;NULL;A;5;35014;894959;3;816;2012-01-27 06:55:59.000;144;211;0;2;816;78
    ....
    Mais pas celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    R_MS_DATPRI;R_MS_ADRPRI;R_MS_ADRDEP;MS_SSCC;R_MS_SSCCPR;R_MS_CPTRMI;R_MS_STMISS;UL_DONORD;UL_CPROIN;UL_ILOGIS;R_MS_UVCDEP;R_MS_DAFIFO;R_MS_UVCREI;R_MS_CODCAR;R_MS_CPTRPI;R_MS_TYPEMI;R_MS_UVCDEP;HAUT_CAL_PALETTE
    2012-02-28 14:35:07.000;01R03;01A140091C;354108320120346723;NULL;0;5;35014;926575;000;2016;2013-01-20 00:00:00.000;0;228;0;0;2016;135
    2012-02-28 11:51:55.000;01R01;01B220190E;030201101047611366;NULL;0;5;35014;385150;001;72;2012-02-28 00:00:00.000;0;000;0;0;72;6,5
    2012-02-28 16:21:16.000;01R02;01A120273B;030201101047620245;NULL;0;5;35014;048252;006;1188;2013-02-13 00:00:00.000;0;214;0;0;1188;121
    2012-02-28 11:48:01.000;01R02;01B170232C;030201101047601428;NULL;0;5;35014;438042;004;864;2015-12-31 00:00:00.000;0;201;0;0;864;108
    2012-02-28 08:44:28.000;01R03;01B230141D;030201101047601299;NULL;0;5;35014;964549;002;852;2013-03-15 00:00:00.000;0;114;0;0;852;105
    2012-02-28 09:26:12.000;01D050260D;01D050041A;030201101047444476;NULL;0;5;35014;699381;000;312;2012-02-28 00:00:00.000;0;211;0;3;312;34
    2012-02-28 09:26:03.000;01D050041A;01D050260D;030201101047444476;NULL;A;5;35014;699381;000;432;2012-02-22 11:06:12.000;120;211;0;2;432;34
    2012-02-28 10:56:37.000;01R01;01XP001;030201101047610475;NULL;0;5;42010;TRANSIT01;000;1;2012-02-28 10:56:35.000;0;000;0;3;1;1
    Pour le deuxième fichier, ma fonction me lit (pour la première ligne pas exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ÿþR _ M S _ D A T P R I ; R _ A D R P R I ; R _ M S _ A D R D E P ...
    Et une ligne sur deux contient juste un espace (" ").

    J'ai pensé à un mauvaise encodage, mais même en changeant ça j'obtient le même résultat. Le plus étonnant est que le premier fichier est bien lu, mais pas le second.
    J'ai bien essayer de demander à google, mais il a pas trouvé non plus.
    Quelqu'un aurait une idée sur la question ?

    EDIT: J'ai remarqué que mon 2ème fichier est 2 fois plus lourd que mon 1er alors qu'ils font a peu près le même nombre de caractère. Je suis sur que c'est un problème d'encodage mais je n'arrive pas à le trouver.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Bon ok j'ai trouvé, en fait mon 2eme fichier était encodé en UTF-16. Mais alors j'ai une deuxième question.

    Cette fonction doit traiter indépendamment des fichiers encodés en UTF-8 et en UTF-16 (apparemment ...). Comment est-ce que je peux savoir comment est encodé mon fichier?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par fhayd Voir le message
    Cette fonction doit traiter indépendamment des fichiers encodés en UTF-8 et en UTF-16 (apparemment ...). Comment est-ce que je peux savoir comment est encodé mon fichier?
    Ya pas de magie, il faut le détecter.
    Je constate que le fichier en UTF-16 commence par un BOM, les deux octets 0xFF et 0xFE.
    Une idée serait de lire d'abord les deux premiers octets, et vérifier s'ils ont cette valeur. Si oui, le fichier est très certainement en UTF-16 (à moins que ton fichier en ISO-8859-15 puisse possiblement commencer par ÿþ) et donc il faut lire la suite en utf-16.
    Si non, alors il est sûrement en ISO, et il faut lire le fichier en ISO en recommençant du début.

    C'est la méthode généralement utilisée pour l'autodétection de charset unicode, même si elle n'est pas 100% parfaite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Ok je vois. Merci, ça suffira pour mon appli je pense. D'autant que mes fichiers d'entrés ont très peu de chance de commencer par ÿþ (à moins que l'utilisateur ait vraiment envie de me faire chier)

    Merci bien

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Si non, alors il est sûrement en ISO, et il faut lire le fichier en ISO en recommençant du début.
    ou en UTF-8, on ne fais pas avancer le shmilblik

    il n'y a pas de solution magique, il y a juste des algorithmes de détection + ou moins efficaces, mais jamais parfais. Je me souviens d'une phrase à la con que tu tappais dans le notepad windows, tu sauvais en iso, tu rechargeait le fichier, et il était persuadé que c'était un fichier chinois en utf-8

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ou en UTF-8, on ne fais pas avancer le shmilblik
    Je partais du principe qu'il n'y avait que deux encodages possibles. Si ce n'est pas le cas, on peut encore assez bien repérer les UTF-16, mais les autres ne sont pas assez différenciables.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Lecture Fichier texte - Encodage
    Par aristeas dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2012, 16h30
  2. Lecture de fichiers et encodage
    Par sliderman dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2008, 20h23
  3. [Encodage] Lecture d'un fichier
    Par GoodSpeed dans le forum C++Builder
    Réponses: 11
    Dernier message: 17/12/2004, 18h31
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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