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 :

extraire une partie d'un corps d'un message


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut extraire une partie d'un corps d'un message
    bonjour,
    je viens vers vous car je suis bloqué.
    en faite j'ai une fonction qui lis des fichiers .eml
    le corps des messages ressemblent à ceci :
    premier fichier : fhgzkfjzghiueghdfgzeiutghzepthaezbgpiebhrerrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrtuegf 2e fichier :
    Nom : Capture2.PNG
Affichages : 311
Taille : 11,0 KoNom : Capture.PNG
Affichages : 256
Taille : 17,4 Ko

    je lis ligne par ligne pour extraire les données de la sections 1 et 3 (à terme je dois mettre ces données dans des propriétés d'objet pour ensuite stocker en base)
    en gros chaque ligne des sections 1 et 3 seront des propriétés et la section 2 sera une seule propriété.

    pour la section 1 et 3 c'est bon, c'est pour la section 2 que je ne sais pas comment faire

    j'ai fais pleins d'essais : par exemple j'ai essayé avec un numéro de ligne et ensuite faire un while pour dire que tant que je suis dans la section 2 j'affiche les données mais ça ne marche pas
    le problème c'est que la section 2 varie d'un fichier à l'autre, et dans certains il y a plusieurs fois 3 sections.

    j'ai même essayé de faire 2 while séparé : le premier parcours les fichiers et repère les lignes où commencent les sections 2 et 3 et ensuite dans le while que j'utilise je met un while pour dire que tant que la ligne actuelle est entre la section 2 et 3 j'affiche les données mais rien ne marche

    j'ai surement mal fais quelque chose mais je n'arrive pas à voir c'est quoi.

    Code JAVA : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public void lireTout()
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
     
                Properties props;
                Session mailSession;
                InputStream source;
                MimeMessage message;
                Email email;
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    System.out.println(f.getAbsolutePath());
     
                    // utilisation de l'API MimeMessage pour ouvrir les fichiers .eml
                    props = System.getProperties();
                    props.put("mail.host", "smtp.dummydomain.com");
                    props.put("mail.transport.protocol", "smtp");
                    mailSession = Session.getDefaultInstance(props, null);
                    source = new FileInputStream(f);
                    message = new MimeMessage(mailSession, source);
     
                    // utilisation de l'API Email pour la lecture du corps des messgages.
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        email = EmailConverter.mimeMessageToEmail(message);
                        // corps du message
                        body = email.getText();
     
                        BufferedReader reader = new BufferedReader(new StringReader(body));
                        String line = reader.readLine();
     
                        String section1 = "============================== SECTION 1 ==============================";
                        String section2 = "============================== SECTION 2 ==============================";
                        String section3 = "============================== SECTION 3 ==============================";
                        String end = "=======================================================================";
     
                        String nomBatch = "Nom du BATCH";
                        String versionBatch = "Version Architecture BATCH";
                        String versionAppli = "Version:";
                        String debut = "Début du Batch";
                        String fin = "Fin du Batch";
                        String duree = "Duree du Batch";
     
                        while (line != null)
                        {
                            /* ============================== SECTION 1 ============================== */
                            if (line.contains(nomBatch))
                            {
                                System.out.println("Batch :" + this.decouper(line, ":"));
                            }
                            if (line.contains(versionBatch))
                            {
                                System.out.println("Version Batch : " + this.decouper(line, ":"));
                            }
                            if (line.contains(versionAppli))
                            {
                                System.out.println("Version Appli : " + this.decouper(line, ":"));
                            }
                            if (line.contains(debut))
                            {
                                System.out.println("Début : " + this.decouper(line, ":"));
                            }
                            /*if (!line.contains(nomBatch) && !line.contains(versionBatch) && !line.contains(versionAppli)
                                && !line.contains(debut) && !line.contains(fin) && !line.contains(duree) && !line.contains(section1)
                                && !line.contains(section2) && !line.contains(section3)  && !line.contains(end))
                            {
                                System.out.println(line);
                            }*/
     
                            /* ============================== SECTION 3 ============================== */
                            if (line.contains(fin))
                            {
                                System.out.println("Fin : " + this.decouper(line, ":"));
                            }
                            if (line.contains(duree))
                            {
                                System.out.println("Durée : " + this.decouper(line, ":"));
                            }
                            line = reader.readLine();
                        }
                        reader.close();
                    }
                }
            }
            catch (IOException | MessagingException exception)
            {
                System.out.println("Erreur lors de la lecture : " + exception.getMessage());
            }
        }
    ça c'est la dernière version que j'ai. même ça c'est pas bon parce que j'ai vu qu'il y avait des données qui sont en dehors des 3 sections (que je n'ai pas besoin de traiter)
    est-ce que vous pouvez m'aider svp

  2. #2
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    bon j'ai finalement trouvé une solution. dites-moi si c'est bon ou si on peut faire plus simple
    Code JAVA : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    public void lireTout()
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
     
                Properties props;
                Session mailSession;
                InputStream source;
                MimeMessage message;
                Email email;
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    System.out.println(f.getAbsolutePath());
     
                    // utilisation de l'API MimeMessage pour ouvrir les fichiers .eml
                    props = System.getProperties();
                    props.put("mail.host", "smtp.dummydomain.com");
                    props.put("mail.transport.protocol", "smtp");
                    mailSession = Session.getDefaultInstance(props, null);
                    source = new FileInputStream(f);
                    message = new MimeMessage(mailSession, source);
     
                    // utilisation de l'API Email pour la lecture du corps des messgages.
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        email = EmailConverter.mimeMessageToEmail(message);
                        // corps du message
                        body = email.getText();
     
                        BufferedReader reader = new BufferedReader(new StringReader(body));
                        String line = reader.readLine();
     
                        String section2 = "============================== SECTION 2 ==============================";
                        String section3 = "============================== SECTION 3 ==============================";
     
                        String nomBatch = "Nom du BATCH";
                        String versionBatch = "Version Architecture BATCH";
                        String versionAppli = "Version:";
                        String debut = "Début du Batch";
                        String fin = "Fin du Batch";
                        String duree = "Duree du Batch";
     
                        boolean tokenFound = false;
                        while (line != null)
                        {
                            /* ============================== SECTION 1 ============================== */
                            if (line.contains(nomBatch))
                            {
                                System.out.println("Batch :" + this.decouper(line, ":"));
                            }
                            if (line.contains(versionBatch))
                            {
                                System.out.println("Version Batch : " + this.decouper(line, ":"));
                            }
                            if (line.contains(versionAppli))
                            {
                                System.out.println("Version Appli : " + this.decouper(line, ":"));
                            }
                            if (line.contains(debut))
                            {
                                System.out.println("Début : " + this.decouper(line, ":"));
                            }
     
                            /* ============================== SECTION 2 ============================== */
                            if (line.equals(section2))
                            {
                                tokenFound = true;
                            }
                            else if (line.equals(section3))
                            {
                                tokenFound = false;
                            }
                            if (tokenFound)
                            {
                                if (!line.contains(section2))
                                {
                                    System.out.println(line);
                                }
                            }
     
                            /* ============================== SECTION 3 ============================== */
                            if (line.contains(fin))
                            {
                                System.out.println("Fin : " + this.decouper(line, ":"));
                            }
                            if (line.contains(duree))
                            {
                                System.out.println("Durée : " + this.decouper(line, ":"));
                                System.out.println("");
                            }
     
                            line = reader.readLine();
                        }
                        reader.close();
                    }
                }
            }
            catch (IOException | MessagingException exception)
            {
                System.out.println("Erreur lors de la lecture : " + exception.getMessage());
            }
        }

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    C'est basique mais ça a l'air de marcher. Et souvent, les solutions les plus simples sont les meilleures
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  4. #4
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    ok cool merci

  5. #5
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    j'ai un souci
    je n'arrive pas à mettre ces données dans des propriétés d'objet.
    pour tester avec un seul champs j'ai fais ça :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                            if (line.contains(nomBatch))
                            {
                                //System.out.println("Batch :" + this.decouper(line, ":").trim());
                                this.unBatchT = new Bilan(this.decouper(line, ":").trim());
                            }
    le problème c'est que si je veux récupérer cette propriété avec son getter je suis obligé de rester dans le if.
    plus bas je mets dans une liste chaque objet this.unBatchT avec this.lesBilans.add(this.unBatchT); à l'intérieur du while toujours.
    mais la liste est toujours vide
    quand je veux accéder avec le getter j'ai un NullPointerException donc l'objet est null mais pourquoi
    je ne comprends pas parce que plus haut j'ai une fonction qui lit un fichier txt et je fais pareille et ça marche

    vous pouvez m'aider svp

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Que fais découper ?

    Je te déconseille également d'utiliser le mot clef "this" si cela n'est pas nécessaire. Cela alourdit pas mal la syntaxe pour pas grand chose.

  7. #7
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    Citation Envoyé par millie Voir le message
    Que fais découper ?
    decouper est juste une fonction qui contient substring en faite. ça m'évite de faire substring à chaque fois. ça retourne un string découpé depuis le caractère que j'entre en 2e paramètre.

    Citation Envoyé par millie Voir le message
    Je te déconseille également d'utiliser le mot clef "this" si cela n'est pas nécessaire. Cela alourdit pas mal la syntaxe pour pas grand chose.
    merci pour l'info je tiens note

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il est probable que ta méthode decouper retourne parfois null, et, donc, provoque une NullPointerException dans ce cas, lors de l'appel de trim().

    1. Soit il est envisageable que decouper() soit utiliser dans un contexte où le trim est optionnel, soit le trim() ne l'est pas et autant le faire dans decouper(), ce qui te permettra de l'appliquer uniquement lorsque ce que va retourner decouper() n'est pas null. Reste à savoir si le constructeur de Bilan accepte en argument une valeur null.
    2. Si Bilan() n'accepte pas de valeur null, autant que decouper() ne retourne pas de null, ou que tu t'arranges pour tester ce cas, d'une manière ou d'une autre, pour remplacer le null par une chaîne vide. Par exemple, en utilisant Apache Commons, tu pourrais écrire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      unBatchT = new Bilan(StringUtils.defaultIfBlank(decouper(line, ":"),"").trim());
    3. A priori, il ne devrait pas avoir de raison qu'une fonction de "découpage" retourne une valeur avec des espaces en bordure, donc autant faire que decouper() retourne toujours une valeur soit null (éventuellement), soit trimmée. Et de faire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      unBatchT = new Bilan(StringUtils.defaultIfBlank(decouper(line, ":"),""));
    4. Ou éventuellement, gérer la valeur par défaut dans decouper :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public static String decouper(String string, String delimiter, String defaultValue) {
           int index = string.indexOf(delimiter);
           if( index<0 ) {
               return defaultValue;
           }
           else {
               return string.substring(0,index).trim(); // ou string.substring(index+1).trim() selon
           }
      }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    decouper ne retourne jamais null en faite. parce que comme je vous ai dis si j'instancie l'objet à l'intérieur du if et que je fais le getter toujours à l’intérieur du if alors il me retourne bien la chaine de caractère. le problème c'est que dès que je sors du if ça marche plus

    voilà ma méthode decouper :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public String decouper(String uneLigne, String caractere)
        {
            return uneLigne.substring(uneLigne.indexOf(caractere) + 1);
        }

  10. #10
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    j'ai fais une petite modif :
    Code JAVA : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    public synchronized void lireTout()
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
     
                Properties props;
                Session mailSession;
                InputStream source;
                MimeMessage message;
                Email email;
     
                String nameBatch = "";
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    System.out.println(f.getAbsolutePath());
     
                    // utilisation de l'API MimeMessage pour ouvrir les fichiers .eml
                    props = System.getProperties();
                    props.put("mail.host", "smtp.dummydomain.com");
                    props.put("mail.transport.protocol", "smtp");
                    mailSession = Session.getDefaultInstance(props, null);
                    source = new FileInputStream(f);
                    message = new MimeMessage(mailSession, source);
     
                    // utilisation de l'API Email pour la lecture du corps des messgages.
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        email = EmailConverter.mimeMessageToEmail(message);
                        // corps du message
                        body = email.getText();
     
                        BufferedReader reader = new BufferedReader(new StringReader(body));
                        String line = reader.readLine();
     
                        String section2 = "============================== SECTION 2 ==============================";
                        String section3 = "============================== SECTION 3 ==============================";
     
                        String nomBatch = "Nom du BATCH";
                        String versionBatch = "Version Architecture BATCH";
                        String versionAppli = "Version:";
                        String debut = "Début du Batch";
                        String fin = "Fin du Batch";
                        String duree = "Duree du Batch";
     
                        boolean tokenFound = false;
                        while (line != null)
                        {
                            /* ============================== SECTION 1 ============================== */
                            if (line.contains(nomBatch))
                            {
                                //System.out.println("Batch :" + this.decouper(line, ":").trim());
                                nameBatch = this.decouper(line, ":").trim();
                                if(nameBatch != null) {
                                unBilan = new Bilan(nameBatch);
                                }
                            }
                            if (line.contains(versionBatch))
                            {
                                //System.out.println("Version Batch : " + this.decouper(line, ":"));
                            }
                            if (line.contains(versionAppli))
                            {
                                //System.out.println("Version Appli : " + this.decouper(line, ":"));
                            }
                            if (line.contains(debut))
                            {
                                //System.out.println("Début : " + this.decouper(line, ":"));
                            }
     
                            /* ============================== SECTION 2 ============================== */
                            if (line.equals(section2))
                            {
                                tokenFound = true;
                            }
                            else if (line.equals(section3))
                            {
                                tokenFound = false;
                            }
                            if (tokenFound)
                            {
                                if (!line.contains(section2))
                                {
                                    //System.out.println(line);
                                }
                            }
     
                            /* ============================== SECTION 3 ============================== */
                            if (line.contains(fin))
                            {
                                //System.out.println("Fin : " + this.decouper(line, ":"));
                            }
                            if (line.contains(duree))
                            {
                                //System.out.println("Durée : " + this.decouper(line, ":"));
                                //System.out.println("");
                            }
                            if(unBilan != null) { // si je fais pas ce contrôle j'ai un null au début et en suite les objets sont présents
                            lesBilans.add(unBilan);
                            }
                            line = reader.readLine();
                        }
                        System.out.println(lesBilans.size());
                        reader.close();
                    }
                }
            }
            catch (IOException | MessagingException exception)
            {
                System.out.println("Erreur lors de la lecture : " + exception.getMessage());
            }
        }
    j'ai mis un contrôle pour vérifier si le champs découpé est non null (je crois que cette condition ne sert à rien parce que même avec ça j'avais un null comme même). ensuite au moment d'ajouter dans la liste je dois vérifier si l'objet est non null car je me suis aperçu que la taille de la liste était de 5 alors que mon fichier de test n'avait que 4 fois les 3 sections. donc au début il y avait un null.
    vous savez pourquoi ça fait ça ?

  11. #11
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    par contre pour la section 2 j'ai un problème : comment on fait pour que toutes les lignes de la section 2 soit un seul string et ensuite l'ajouter dans l'objet ?
    j'ai fais ça mais ça ne marche pas. je me suis dis je concatène les lignes et ensuite j'ajoute dans l'objet, une fois ajouté je remets le string à vide.
    Code JAVA : 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
     
                            if (line.equals(section2))
                            {
                                tokenFound = true;
                            }
                            else if (line.equals(section3))
                            {
                                tokenFound = false;
                            }
                            if (tokenFound)
                            {
                                if (!line.contains(section2))
                                {
                                     //System.out.println(line);
                                     bilan += line;
                                     unBilan.setBilanBatch(bilan);
                                }
     
                            }
                            bilan = "";
    comment je peux faire pour prendre toute la section 2 et le mettre dans un string pour le mettre dans l'objet ?
    en sachant que pour chaque bloc de 3 sections il y a la section 2 qui diffère d'un bloc à un autre et d'un fichier à un autre

  12. #12
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    bon je crois que j'ai trouvé
    Code JAVA : 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
     
                            if (line.equals(section2))
                            {
                                tokenFound = true;
                            }
                            else if (line.equals(section3))
                            {
                                tokenFound = false;
                                bilan = "";
                            }
                            if (tokenFound)
                            {
                                if (!line.contains(section2))
                                {
                                     //System.out.println(line);
                                     bilan += line;
                                     unBilan.setBilanBatch(bilan);
                                }
     
                            }
    la ligne ou je remets le string à vide il fallait le mettre plus haut dans le cas où tokenFound est false.
    dites moi si c'est bon

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je n'ai pas trop regardé, mais voici comment cela se code un peu plus proprement ton cas.
    Et cela rejoint un peu ce que j'avais dit sur le thread sur les threads, il faut faire des méthodes simples, qui ne font pas 50.000 trucs (lister des fichiers d'un répertoire + convertir un format en txt + faire du parsing au sein d'une même méthode)

    Cela se fait plutôt comme cela :

    Tu définis clairement ton objet qui sera le résultat de ton parsing :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public class Batch { //où BatchExecution ou BatchReport
     
    	private String name;
    	private String architectureVersion;
    	private String version;
    	private String startDate; //@TODO : Avoir un objet Date
    	private String endDate; //@TODO : Avoir un objet Date
    	private String duration; //@TODO : Etre en int/long et renommé en durationInSeconds par exemple
     
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getArchitectureVersion() {
    		return architectureVersion;
    	}
    	public void setArchitectureVersion(String architectureVersion) {
    		this.architectureVersion = architectureVersion;
    	}
    	public String getVersion() {
    		return version;
    	}
    	public void setVersion(String version) {
    		this.version = version;
    	}
    	public String getStartDate() {
    		return startDate;
    	}
    	public void setStartDate(String startDate) {
    		this.startDate = startDate;
    	}
    	public String getEndDate() {
    		return endDate;
    	}
    	public void setEndDate(String endDate) {
    		this.endDate = endDate;
    	}
    	public String getDuration() {
    		return duration;
    	}
    	public void setDuration(String duration) {
    		this.duration = duration;
    	}
     
     
    }
    Ensuite, tu définis ton parser. Si le code est un peu pourri dedans, ce n'est pas bien grave car la signature de la méthode est claire
    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
     
    public class BatchReader {
     
    	static private final String BATCH_NAME = "Nom du BATCH:";
    	static private final String BATCH_ARCHITECTURE_VERSION = "Version Architecture BATCH: ";
     
    	static public Batch read(File file) throws IOException {
    		try (InputStream inputStream = (new FileInputStream(file))) {
    			return read(inputStream);
    		}
    	}
     
    	static public Batch read(InputStream inputStream) throws IOException {
    		try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
    			Batch batch = new Batch();
     
    			String line = null;
    			while ((line = reader.readLine()) != null) {
    				String trimLine = line.trim();
    				if (trimLine.startsWith(BATCH_NAME)) {
    					batch.setName(trimLine.substring(BATCH_NAME.length()));
    				}
    				if (trimLine.startsWith(BATCH_ARCHITECTURE_VERSION)) {
    					batch.setArchitectureVersion(trimLine.substring(BATCH_ARCHITECTURE_VERSION.length()));
    				}
    				// etc.
    			}
     
    			if (StringUtils.isEmpty(batch.getName())) {
    				throw new IOException("No batch name for this file");
    			}
     
    			return batch;
    		}
    	}
     
    }

    Il ne faut jamais prendre tous les problèmes d'un coup sous peine d'avoir un code trop lourd.
    C'est même bien plus simple pour les gens à qui tu demandes de l'aide (ici ou ailleurs), car ton problème sera localisé dans une classe assez "simple".

    edit : Je sais que je ne réponds pas vraiment à ta question. Mais mes conseils sont quand même importants.

  14. #14
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    je prends note merci
    je vais essayer de simplifier mon code

  15. #15
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    par contre la partie où je met le fichier au format mimeMessage pour ensuite avoir le corps du message en string je suis obligé de le garder dans la fonction non ?
    vu que si j'enlève cette partie le message n'est pas affiché au bon format

  16. #16
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Il faut absolument qu'il y ait du code testable avec un flux au format texte.

    Tu peux éventuellement faire une méthode supplémentaire en charge de la conversion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class BatchReader {
     
    	static public Batch readFromText(File file) throws IOException; 
    	static public Batch readFromText(InputStream inputStream) throws IOException;
    	static public Batch readFromEml(File file) throws IOException; //effectue la conversion en plus
    La conversion pourrait être délégué complètement à autres choses, mais c'est probablement trop pour ton cas.

  17. #17
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    j'ai essayé de faire une fonction à part pour la conversion et j'ai pas trop réussi

    en tout cas je tiens compte de vos suggestions et je vais essayer d'alléger le code parce que si non même moi je vais m'y perdre

  18. #18
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    Citation Envoyé par Mr.Robot12 Voir le message
    j'ai essayé de faire une fonction à part pour la conversion et j'ai pas trop réussi
    j'ai réussi à déléguer la conversion en MimeMessage puis en String à une fonction à part. j'ai aussi utilisé try/with ressources comme vous m'avez suggéré
    Code JAVA : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
        private Bilan unBilan;
        private static final String SECTION1 = "============================== SECTION 1 ==============================";
        private static final String SECTION2 = "============================== SECTION 2 ==============================";
        private static final String SECTION3 = "============================== SECTION 3 ==============================";
        private static final String NOM_BATCH = "Nom du BATCH: ";
        private static final String VERSION_ARCHITECTURE = "Version Architecture BATCH: ";
        private static final String VERSION_APPLI = "Version: ";
        private static final String DEBUT = "Début du Batch : ";
        private static final String FIN = "Fin du Batch : ";
        private static final String DUREE = "Duree du Batch: ";
        private static final Properties PROPS = System.getProperties();
     
        private String formatMimeMessageToString(File file) throws FileNotFoundException, MessagingException
        {
            // utilisation de l'API MimeMessage pour ouvrir les fichiers .eml
            PROPS.put("mail.host", "smtp.dummydomain.com");
            PROPS.put("mail.transport.protocol", "smtp");
            Session mailSession = Session.getDefaultInstance(PROPS, null);
            InputStream source = new FileInputStream(file);
            MimeMessage message = new MimeMessage(mailSession, source);
     
            // utilisation de l'API Email pour la lecture du corps des messgages.
            Email email = EmailConverter.mimeMessageToEmail(message);
            return email.getText();
        }
     
        public void lireTout() throws IOException
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
     
                String nomBatch = "";
                String versionArchitecture = "";
                String versionAppli = "";
                String heureDebut = "";
                String bilan = "";
                String heureFin = "";
                String duree = "";
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    System.out.println(f.getAbsolutePath());
     
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        // corps du message
                        body = formatMimeMessageToString(f);
     
                        boolean tokenFound = false;
                        try (BufferedReader reader = new BufferedReader(new StringReader(body)))
                        {
                            String line = null;
                            while ((line = reader.readLine()) != null)
                            {
                                /*============================== SECTION 1 ==============================*/
                                if (line.contains(NOM_BATCH))
                                {
                                    nomBatch = decouper(line, ":");
                                    if (nomBatch != null)
                                    {
                                        unBilan = new Bilan(nomBatch);
                                        unBilan.setIdBatch(f.getAbsolutePath());
                                    }
                                }
                                if (line.contains(VERSION_ARCHITECTURE))
                                {
                                    versionArchitecture = decouper(line, ":");
                                    if (versionArchitecture != null)
                                    {
                                        unBilan.setVersionArchitecture(versionArchitecture);
                                    }
                                }
                                if (line.contains(VERSION_APPLI))
                                {
                                    versionAppli = decouper(line, ":");
                                    if (versionAppli != null)
                                    {
                                        unBilan.setVersionAppli(versionAppli);
                                    }
                                }
                                if (line.contains(DEBUT))
                                {
                                    heureDebut = decouper(line, ":");
                                    if (heureDebut != null)
                                    {
                                        unBilan.setHeureDebut(heureDebut);
                                    }
                                }
                                /*============================== SECTION 2 ==============================*/
                                if (line.equals(SECTION2))
                                {
                                    tokenFound = true;
                                }
                                else if (line.equals(SECTION3))
                                {
                                    tokenFound = false;
                                    bilan = "";
                                }
                                if (tokenFound)
                                {
                                    if (!line.contains(SECTION2))
                                    {
                                        bilan += line + "\n";
                                        if (bilan != null)
                                        {
                                            unBilan.setBilanBatch(bilan.trim());
                                        }
                                    }
                                }
                                /*============================== SECTION 3 ==============================*/
                                if (line.contains(FIN))
                                {
                                    heureFin = decouper(line, ":");
                                    if (heureFin != null)
                                    {
                                        unBilan.setHeureFin(heureFin);
                                    }
                                }
                                if (line.contains(DUREE))
                                {
                                    duree = decouper(line, ":");
                                    if (duree != null)
                                    {
                                        unBilan.setDuree(duree);
                                    }
                                }
                                if (unBilan != null)
                                {
                                    lesBilans.add(unBilan);
                                }
                            }
                        }
                    }
                }
            }
            catch (IOException | MessagingException exception)
            {
                exception.printStackTrace();
            }
        }
    qu'est-ce que je pourrai simplifier encore ?

  19. #19
    Membre confirmé Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Par défaut
    UPDATE : j'ai délégué à une fonction toute la partie ou je cherche les données et instancie l'objet pour ensuite ajouter à la liste :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
        private static final String SECTION2 = "============================== SECTION 2 ==============================";
        private static final String SECTION3 = "============================== SECTION 3 ==============================";
        private static final String NOM_BATCH = "Nom du BATCH: ";
        private static final String VERSION_ARCHITECTURE = "Version Architecture BATCH: ";
        private static final String VERSION_APPLI = "Version: ";
        private static final String DEBUT = "Début du Batch : ";
        private static final String FIN = "Fin du Batch : ";
        private static final String DUREE = "Duree du Batch: ";
        private boolean tokenFound = false;
        private String nomBatch = "";
        private String versionArchitecture = "";
        private String versionAppli = "";
        private String heureDebut = "";
        private String bilan = "";
        private String heureFin = "";
        private String duree = "";
     
        private void instancierObjet(String line, File f) {
            /* ============================== SECTION 1 ============================== */
            if (line.contains(NOM_BATCH))
            {
                nomBatch = decouper(line, ":");
                if (nomBatch != null)
                {
                    unBilan = new Bilan(nomBatch);
                    unBilan.setIdBatch(f.getAbsolutePath());
                }
            }
            if (line.contains(VERSION_ARCHITECTURE))
            {
                versionArchitecture = decouper(line, ":");
                if (versionArchitecture != null)
                {
                    unBilan.setVersionArchitecture(versionArchitecture);
                }
            }
            if (line.contains(VERSION_APPLI))
            {
                versionAppli = decouper(line, ":");
                if (versionAppli != null)
                {
                    unBilan.setVersionAppli(versionAppli);
                }
            }
            if (line.contains(DEBUT))
            {
                heureDebut = decouper(line, ":");
                if (heureDebut != null)
                {
                    unBilan.setHeureDebut(heureDebut);
                }
            }
            /* ============================== SECTION 2 ============================== */
            if (tokenFound)
            {
                if (!line.contains(SECTION2))
                {
                    bilan += line + "\n";
                    if (bilan != null)
                    {
                        unBilan.setBilanBatch(bilan.trim());
                    }
                }
            }
            /* ============================== SECTION 3 ============================== */
            if (line.contains(FIN))
            {
                heureFin = decouper(line, ":");
                if (heureFin != null)
                {
                    unBilan.setHeureFin(heureFin);
                }
            }
            if (line.contains(DUREE))
            {
                duree = decouper(line, ":");
                if (duree != null)
                {
                    unBilan.setDuree(duree);
                }
            }
            if (unBilan != null)
            {
                lesBilans.add(unBilan);
            }
        }
     
        public void lireTout() throws IOException
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    System.out.println(f.getAbsolutePath());
     
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        // corps du message
                        body = formatMimeMessageToString(f);
     
                        //boolean tokenFound = false;
                        try (BufferedReader reader = new BufferedReader(new StringReader(body)))
                        {
                            String line = null;
                            while ((line = reader.readLine()) != null)
                            {
                                if (line.equals(SECTION2))
                                {
                                    tokenFound = true;
                                }
                                else if (line.equals(SECTION3))
                                {
                                    tokenFound = false;
                                    bilan = "";
                                }
                                instancierObjet(line, f);
                            }
                        }
                    }
                }
            }
            catch (IOException | MessagingException exception)
            {
                exception.printStackTrace();
            }
        }
    je ne vois pas ce que je pourrai découper d'autre. dites-moi ce que je peux améliorer

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

Discussions similaires

  1. Extraire une partie d'un string
    Par Bloodscalp dans le forum Langage
    Réponses: 9
    Dernier message: 20/09/2006, 11h43
  2. Réponses: 7
    Dernier message: 18/07/2006, 15h56
  3. Réponses: 2
    Dernier message: 21/05/2006, 20h31
  4. extraire une partie d'image d'une image source
    Par Zen_Fou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2006, 12h20
  5. extraire une partie d'un document rtf
    Par yac dans le forum Oracle
    Réponses: 12
    Dernier message: 08/01/2006, 11h44

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