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 :

Extraire des informations d'un fichier MHT


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Extraire des informations d'un fichier MHT
    Bonjour,

    Je voudrais aller chercher des informations dans un fichier .MHT. Le soucis, c'est qu'en tant que tel ils ne sont pas vraiment lisible avec un éditeur de texte :/
    En gros, je voudrais passer de ca :
    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
    From: 
    Subject: 
    Date: 
    MIME-Version: 1.0
    Content-Type: multipart/related;
    	type="text/html";
    	boundary="------NEXT_PART_TOOLSHEET"
    This is a multi-part message in MIME format.
     
    --------NEXT_PART_TOOLSHEET
    Content-Type: text/html;
    	charset="utf-8"
    Content-Transfer-Encoding: base64
    Content-Location: 
     
    //48ACEARABPAEMAVABZAFAARQAgAEgAVABNAEwAIABQAFUAQgBMAEkAQwAgACIALQAvAC8AVwAz
    AEMALwAvAEQAVABEACAASABUAE0ATAAgADQALgAwACAAVAByAGEAbgBzAGkAdABpAG8AbgBhAGwA
    LwAvAEUATgAiAD4ADQAKADwASABUAE0ATAA+ADwASABFAEEARAA+AA0ACgA8AE0ARQBUAEEAIABo
    AHQAdABwAC0AZQBxAHUAaQB2AD0AQwBvAG4AdABlAG4AdAAtAFQAeQBwAGUAIABjAG8AbgB0AGUA
    bgB0AD0AIgB0AGUAeAB0AC8AaAB0AG0AbAA7ACAAYwBoAGEAcgBzAGUAdAA9AHUAdABmAC0AOAAi
    AD4ADQAKADwATQBFAFQAQQAgAGMAbwBuAHQAZQBuAHQAPQAiAE0AUwBIAFQATQBMACAANgAuADAA
    MAAuADIAOAAwADAALgAxADEAMAA2ACIAIABuAGEAbQBlAD0ARwBFAE4ARQBSAEEAVABPAFIA
    (...)
    A ca :

    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML><HEAD>
    <META http-equiv=Content-Type content="text/html; charset=utf-8">
    <META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
    <BODY> 
    <xml id="data">
    <?xml version="1.0"?>
    <Toolsheet>
    <DefaultDisplayOptions>
    <optionSummaryPage>on</optionSummaryPage>
    <optionToolpathSummary>on</optionToolpathSummary>
    <optionSurfaceImages>off</optionSurfaceImages>
    <MSstrategy>off</MSstrategy>
    <MScuttingmode>off</MScuttingmode>
    <MStoolnumber>on</MStoolnumber>
    <MSmaterial>off</MSmaterial>
    <MSmachinetool>off</MSmachinetool>
    <MStool>off</MStool>
    <MScutterdiameter>on</MScutterdiameter>
    <MScornerradius>on</MScornerradius>
    <MSshaftradius>off</MSshaftradius>
    <MSarotation>on</MSarotation>
    <MSbrotation>on</MSbrotation>
    <MScrotation>on</MScrotation>
    <MSflatradius>off</MSflatradius>
    <MStaperangle>off</MStaperangle>
    <MStipangle>off</MStipangle>
    <MSflutelength>off</MSflutelength>
    <MSflutediameter>off</MSflutediameter>
    La tranformation présentée ici est obtenu en faisant "Show source" dans IE.

    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
    qu'est-ce qui te bloque là dedans?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Et bien je sais pas comment faire pour avoir la transformation en Java. J'arrive à l'avoir en faisant un "show source" après avoir ouvert le fichier MHT dans IE, mais comment avoir ca directement dans du code Java ?

  4. #4
    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
    Qu'est-ce qui te bloque. Lire le fichier? Localiser la zone qui t'intéresse dedans? Convertir le base64?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Lire le fichier, je ferais comme pour un fichier texte.
    Localiser la bonne aprtie : lecture ligne par ligne + regexp.
    C'est donc la conversion base64 qui bloque si je me fie à tes propositions. C'est ca qui permet de convertir les "BGUIEOCCMEIOCE" en "<html>...<...>" ?

    En tout cas, merci pour ta patience

  6. #6
    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
    soit tu applique à la mainh l'algorithme simple de décodage [ame="http://fr.wikipedia.org/wiki/Base64"]base64[/ame], soit tu utilise une librairie externe, comme par exemple commons codec de jakarta, qui possède un codec base64.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Juste un petit soucis sur le décodage : dois je le faire ligne par ligne ? Parce que pour le moment je met tout dans une String et je lance un Decode là dessus. Et évidemment, ca ne marche pas :/

  9. #9
    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écoder tout le bloc base64 d'un coup ou alors travailler 4 caractères encodés par quatre caractère encode (cf l'algorithme)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Pour les tests, je n'ai laissé dans le fichier MHT que le bloc Base64.

    Je le traite de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String filePath = "N:\\X_system\\5030220.mht";
     
    Scanner scanner=new Scanner(new File(filePath));
    String tempString = "";
    while (scanner.hasNextLine()) {
             tempString += new String(scanner.nextLine());
    }
    scanner.close();
     
    byte[] array = Base64.decodeBase64(tempString);
    String buffer1 = new String(array);
    System.out.println(buffer1);
    Mon soucis appremment est que lors de la lecture de la ligne, le "cast" implicite en String fait que mon information est "dénaturée". Il ne peut plus décoder...

  11. #11
    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 aeMAETH Voir le message

    Mon soucis appremment est que lors de la lecture de la ligne, le "cast" implicite en String fait que mon information est "dénaturée". Il ne peut plus décoder...
    Quelle erreur as-tu? As-tu remarqué au passage que le binaire de ton fichier encodé en base64 dans ton exemple est de l'utf-16 (contrairement à ce que dit l'entete), ce qui fait que tu devra le lire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String buffer1 = new String(array,"UTF-16");
    System.out.println(buffer1);
    PS:
    tes new String() dans la boucle ne servent à rien et elle peut avantageusement être remplacée par ce code plus performant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    StringBuffer tempString = new StringBuffer();
    while (scanner.hasNextLine()) {
             tempString.append(scanner.nextLine());
    }
    scanner.close();
     
    byte[] array = Base64.decodeBase64(tempString.toString());

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Je n'avais pas d'erreurs, la sortie était tout simplement illisible.
    Question : comment savoir quel encodage est utilisé ? (je m'était fié à l'entête moi... une machine ca ne ment pas pourtant ;') )

    En tout cas je te remercie vraiment beaucoup !

  13. #13
    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
    si tu décode de l'utf-16 avec de l'utf-8, tu va avoir un caractère sur deux correct dans la zone ASCII avec entre deux un caractère illisible, le bordel dans le reste

    Il existe des algorithmes pour détecter l'encodage, mais je les connais pas. Des librairies comme ICU spécialisées dans la gestion de caractère uniconde ont ce genre d'algorithme implémentés:

    http://userguide.icu-project.org/conversion/detection

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

Discussions similaires

  1. Extraire des information d'un fichier
    Par cinou01 dans le forum Langage
    Réponses: 1
    Dernier message: 06/05/2009, 17h02
  2. Réponses: 0
    Dernier message: 15/04/2009, 15h57
  3. Réponses: 11
    Dernier message: 08/10/2007, 13h15
  4. Extraire des informations précises d'un fichier
    Par cameleon33 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 14/10/2006, 13h40

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