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

Tomcat et TomEE Java Discussion :

Encodage fichier csv sous Linux


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut Encodage fichier csv sous Linux
    Bonjour, je ne sais pas si c'est le bon endroit pour poster mon problème mais bon n’hésitez pas a le déplacer :

    J'ai une application web sur une serveur tomcat (installé sur Windows).
    Parmi les fonctionnalités je fais l'import d'un fichier csv ( format ANSI) :
    - Insertion en base données des ligne importés
    - création d'un fichier csv résultat pour les lignes insérées et le lignes en erreur.
    Je me base aussi sur un fichier .properties pour écrire dans mon fichier csv résultat.

    Jusqu’à là tout fonctionne bien comme il faut.

    Mon problème vient après avoir installé Tomcat sur une machine Linux, les accents sont mal interprétés lors de la lecture ou l’écriture du fichier csv.

    J'ai ajouté le charset dans les inputStream sans résultat conséquent.
    Les logs ne m'avancent pas trop parce que Mon serveur Linux n'est pas configuré pour afficher les caractères spéciaux

    Je ne sais pas si je dois changer le format du fichier .properties au format UTF pour que ce soit bien interprété ou dois je plutôt me concentrer sur l’écriture du fichier csv...

    Je suis preneur de tous vos idées ... Merci d'avance.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par cisnake Voir le message
    J'ai ajouté le charset dans les inputStream sans résultat conséquent.
    Ce qui est étonnant, car inputStream n'a aucun méthode ou constructeur qui prends un charset

    Si tu nous montrait ton code de lecture / écriture pour commencer et ton code de lecture du properties?

    Citation Envoyé par cisnake Voir le message
    Les logs ne m'avancent pas trop parce que Mon serveur Linux n'est pas configuré pour afficher les caractères spéciaux
    Du mal à comprendre le sens. Tu rappatrie le log et tu l'ouvre dans ton éditeur en local, si le problème et que tu n'as pas de console sur le serveur...

  3. #3
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par cisnake Voir le message
    - Insertion en base données des ligne importés
    Dans la base de données, ils sont bien ou mal interprétés ?
    F*ck it ! Do it !

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ce qui est étonnant, car inputStream n'a aucun méthode ou constructeur qui prends un charset
    Il doit faire référence à l'InputStreamReader

    Pour le problème, à la base, les fichiers properties sont par défaut en ISO-8859-1
    Quand tu écris ton fichier csv, tu utilises quel encodage ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponses.
    Du coup j'ai un peu avancé entre temps :

    J'utilise deux fichier properties:
    - fichier1 (UTF-8) : contenant (clé/valeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entete.result = col1;col2;....;Date début période;...
    - fichier2 (iso-8859-1) : contenant (clé/valeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import.result.lines = {0} ligne(s) ont été traitée(s)
    import.inserted.lines = {0} ligne(s) ont été insérée(s)
    Coté code Je valorise un String en lisant dans le deux fichiers properties et le fichier csv d'import .
    Un log (coté Linux ) sur ce String donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    col1;col2;....;Date d�but p�riode     fin p�riode....
     
    6968637;;ETAT;;PE;LABEL;20;12;EUR;30/10/2013;;;;;;dfddfé;OK
     
     
    1 ligne(s) ont été traitée(s)
    1 ligne(s) ont été insérée(s)
    0 ligne(s) sont en anomalie
    On voit bien la différence entre la première ligne et les deux dernière lignes.

    Coté base de données l'information "dfddfé" est bien insérée.

    Le code pour ecrire le fichier CSV:
    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
     
     
    data = csv.getBytes();
    		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
     
    		ServletOutputStream stream =null;
     
    		try {
    			response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
    			response.setContentLength(data.length);
    			response.setContentType("application/vnd.ms-excel");
     
    			stream = response.getOutputStream();
    			stream.write(data);
     
    		} catch (IOException ioe) {
    			throw new IOException(ioe.getMessage());
     
    		} finally {
    			// close the output stream
    			if(stream != null) {
    				stream.close();
    			}
    		}

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Comment accèdes-tu au fichier Properties 1, celui-en UTF-8 ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par cisnake Voir le message
    M
    Un log (coté Linux ) sur ce String donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    col1;col2;....;Date d�but p�riode     fin p�riode....
     
    6968637;;ETAT;;PE;LABEL;20;12;EUR;30/10/2013;;;;;;dfddfé;OK
     
     
    1 ligne(s) ont été traitée(s)
    1 ligne(s) ont été insérée(s)
    0 ligne(s) sont en anomalie
    Vu qu'on ne sais pas ni comment tu affiche ce résultat (console, page web, ... ?) ni comment tu lit tes fichiers properties, on n'est pas plus avancé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data = csv.getBytes();
    PAN!
    toujours préciser dans quel encodage tu veux tes bytes (iso, utf, .. ?) aussi, il aurait été encore plus propre de construire un writer sur ton outputstream en précisant l'encodage à utiliser.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Comment accèdes-tu au fichier Properties 1, celui-en UTF-8 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResourceBundle messageBundle = ResourceBundle.getBundle( "nom_fichier", FacesContext.getCurrentInstance().getViewRoot().getLocale() );

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Comme dit, par défaut, le fichier Properties est lu en ISO-8859-1, ton encodage réel n'est pas pris en compte.
    Tu as le choix de modifier le défaut ou remplacer tes caractères spéciaux par leur valeur unicode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    é -> \u00E9
    è -> \u00E8
    etc...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Vu qu'on ne sais pas ni comment tu affiche ce résultat (console, page web, ... ?) ni comment tu lit tes fichiers properties, on n'est pas plus avancé
    J'affiche cette ligne dans mon fichier de log (Linux)... Quand je transfère le fichier en Windows J'ai ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LUFFY_CSV     Compte/Contrat/Feuillet/Service;Abonne;Libelle;Date;Type de ligne;Codefrais;Quantite;PrixUnitaire;Devise;Date d�but p�riode;Date fin p�riode;CA international ou National;Taux TVA;REFCO;SMIS;JUSTIFICATIF;Etat;message
    6968637;;AmineINDEM;;PE;INDEM-A;20;12;EUR;30/10/2013;;;;;;dfddfé;OK
     
     
    1 ligne(s) ont été traitée(s)
    1 ligne(s) ont été insérée(s)
    0 ligne(s) sont en anomalie
    Du coup J'ai deux pistes :
    - changer le fichier1 en (iso-8859-1)
    - definir l'encoding pour ServletOutputStream

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    je dirais les 2
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Voila

    J'ai ajouté la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     response.setCharacterEncoding("ISO8859-1");
    Mais toujours rien.

    Pour le fichier1 ... on peut dire que le problème est résolu ( je vais le changer dès que je regarde le dernier point)

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    c'est surtout l'écriture du fichier csv qui doit être faite en ISO-8859-1
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu dois définir ton encodage partout.

    Tes fichiers properties sont lus par java.util.Properties ou comme ressource bundle => Ils doivent être en iso8859-1
    Tu envoie une réponse à l'utilisateur: tu dois créer un Writer avec le bon encodage pour l'utilisateur
    Tu stoke dans les logs -> Log4J gère bien ça, par contre pour lire les logs, tu dois les lire avec un client genre notepad++ en précisant correctement l'encodage. L'encodage étant le même que celui que tu as configuré dans la config log4j

    Là j'ai l'impression qu'à aucun niveau tu n'a géré l'encodage

  15. #15
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Effectivement ... Je pense que c'est au niveau du ServletOutputStream de HttpServletResponse qu'il faut mentionner l'encodage ...
    Mais jusqu'a maintenant je ne sais pas comment faire

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par cisnake Voir le message
    Voila

    J'ai ajouté la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     response.setCharacterEncoding("ISO8859-1");
    Mais toujours rien.me est résolu ( je vais le changer dès que je regarde le dernier point)
    Ca ne changera rien tant que tu fera un CSV.getByte() et que tu fourera ça directement dans l'outputStream. Tu travail avec du texte => Travaille exclusivement avec des Writer / Reader, jamais avec des byte[]

  17. #17
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 65
    Points : 47
    Points
    47
    Par défaut
    Problème Résolu avec l'utilisation des Writer.
    Merci

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

Discussions similaires

  1. encodage fichier csv problématique sous windows
    Par marco056 dans le forum Général Python
    Réponses: 15
    Dernier message: 01/05/2015, 19h10
  2. Problème encodage UTF-8 d'un fichier csv sous excel
    Par mobinaute dans le forum Excel
    Réponses: 2
    Dernier message: 01/03/2013, 23h58
  3. Réponses: 2
    Dernier message: 19/10/2009, 21h36
  4. Fichier effacés sous linux ....
    Par vbcasimir dans le forum Administration système
    Réponses: 4
    Dernier message: 09/12/2004, 09h28
  5. Réponses: 5
    Dernier message: 06/03/2003, 13h27

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