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

Documents Java Discussion :

Mauvaise récupération de texte à partir du fichier .PDF


Sujet :

Documents Java

  1. #21
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    j'ai essayé d'obtenir une expression régulière avec regex , voila le demo
    Cette expression récupère toute la ligne qui contient le mot lés " (Scored)" méme s'elle retourne à la ligne.

    Alors, j'ai modifié cette ligne de code java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pattern pattern = Pattern.compile("((\\d+(?:\\.\\d+)?).*\\(Scored\\))");

    J'ai ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Section : null Content : [ ,  , CIS Ubuntu 12.04 LTS Server Benchmark ,  , v1.1.0 - 01-07-2015
    J'en sais pas pourquoi elle fonctionne dans le site regex mais dans le code java retourne des faux résultats.

  2. #22
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    1. Non. Elle ne fonctionne pas. Essaye simplement de dupliquer ta section "scored" et tu verras ce qu'il se passe. Les tests c'est comme les spécifications : elles doivent être complètes au départ, sinon le résultat ne fonctionne pas sur le cas complet final.
    2. Et je t'ai pourquoi de toute façon tu ne pourrais pas procéder comme ça. Si tu découpes ton texte en ligne, il n'y aucune raison que ça fonctionne. Si tu ne découpes pas ton texte en ligne, il faut que la regexp sélectionne des sections entières (toutes leurs lignes), donc un truc du genre "qui matche une suite de nombres séparés par des . en début de ligne, jusqu'à une autre suite du même type non compris, et entre les deux, n'importe quoi sauf toujours cette même suite, dont le mot (Score) quelque part dedans". Je peux te dire que ça va t'être un peu plus complexe que de traiter des lignes séparemment.
    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.

  3. #23
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Comment je veux découper le texte du fichiers en ligne (sur quel critère se base ). De plus, le fusion de deux lignes s'il existe le mot " (Scored)" comment doit etre fait en java?

    Vraiment j'ai rencontré des difficultés , merci de m'aider Monsieur.

  4. #24
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Comment je veux découper le texte du fichiers en ligne (sur quel critère se base ).
    Je ne comprends pas trop la question. On découpe déjà le fichier en ligne sur la base que le fichier contient des lignes, et qu'on le lit ligne par ligne.
    C'est ce que fait cette ligne de code : List<String> lignes = Files.readAllLines(Paths.get("extractPdf.txt"));
    Citation Envoyé par syrine01 Voir le message
    De plus, le fusion de deux lignes s'il existe le mot " (Scored)" comment doit etre fait en java?
    Sans parler de Java pour commencer, il suffit de réfléchir un peu. Reprenons ton exemple :
    8.1.6 Record Events That Modify the System's Network
     Environment (Scored)
    Que remarque-t-on ? Un titre commence par un motif de type "une suite de nombres séparés par des .", ce qu'on a sélectionné jusqu'à maintenant avec : Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");Seulement, lorsque cette ligne ne contient ni (Scored) ni (Not Scored), on sait qu'on n'a pas le titre entier, n'est-ce-pas. Donc qu'il faut récupérer les lignes suivantes jusqu'à ce qu'on ait l'une de ces deux expression, et fusionner ces lignes pour en faire une seule (on peut garder les \n s'il faut, si on veut garder la structure multi-lignes du titre, si on a besoin).

    La problématique, c'est qu'on va traiter une ligne, on va détecter que c'est un titre incomplet, puis on va lire les lignes suivantes, et tant qu'on a pas le titre complet, il faut les supprimer de la liste, et les concaténer au titre incomplet. Donc il semble évident qu'on ait besoin :
    1. de détecter les titres incomplets
    2. de savoir où ils se trouvent pour pouvoir les remplacer par le titre complet
    3. de savoir où se trouve les lignes qui le complètent


    Détecter les titres incomplets, ça on sait faire, c'est ceux qui matchent la regexp et ne contiennent ni (Scored) ni (Not Scored). En Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     pattern.matcher(ligne).matches() && !ligne.contains("(Scored)") && !ligne.contains("(Not Scored)")
    Pour savoir où se trouve une ligne, il suffit de connaître son index dans la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int titre=-1; // on utilise -1 pour indiquer qu'on n'a pas de titre
    for(int i=0; i<lignes.size(); i++) {
     
         if ( pattern.matcher(ligne).matches() && !ligne.contains("(Scored)") && !ligne.contains("(Not Scored)") ) {
              titre = i; // on a détecter un titre incomplet, donc on stocke sa position
         }
     
    }
    Maintenant, quand titre n'est pas -1, on sait qu'on a un titre incomplet, donc dans la boucle, on va faire quelque chose de spécial : regarder si on trouve la fin du titre pour le complèter.

    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
     
    int positiontitre=-1; // on utilise -1 pour indiquer qu'on n'a pas de titre
    for(int i=0; i<lignes.size(); i++) {
     
         if ( pattern.matcher(ligne).matches() && !ligne.contains("(Scored)") && !ligne.contains("(Not Scored)") ) {
              positiontitre = i; // on a détecter un titre incomplet, donc on stocke sa position
         }
         else if ( positiontitre!=-1 ) { // on sait qu'on a un titre incomplet à complèter...
             if ( ligne.contains("(Scored)") || ligne.contains("(Not Scored)") ) { // on détecte si on a la fin du titre
                 // ici on a la fin du titre, et on sait qu'il est en i
                 // donc maintenant on va regrouper toutes les lignes entre positiontitre et i, et on passera au titres suivants
             }
         }
     
    }
    Pour regrouper les lignes entre positiontitre et i, il faut déjà les parcourir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int j=positiontitre; j<=i; j++) {
    }
    Et donc il faut les concaténer. Pour faire ça on peut utiliser un StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringBuilder sb = new StringBuilder();
    for(int j=positiontitre; j<=i; j++) {
     
           if ( sb.length()>0 ) { // si on a déjà quelque chose dans le StringBuilder, on ajouter un retour chariot pour passer à la ligne
                sb.append("\n");
           }
           sb.append(lignes.get(j));
     
    }
    String titrecomplet = sb.toString();
    Si tu ne veux pas des passages à la ligne entre les différentes parties de ligne de titres, tu peux enlever le "if".
    Et pour le remplacer dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignes.set(positionTitre, titreComplet);
    Maintenant, il faut supprimer les bouts qu'on a ajouté, c'est-à-dire les lignes entre positiontitre et i, sauf la première, puisque c'est le titre complet maitenant. Il suffit de parcourir les lignes et de les supprimer avec la méthode remove(index) de List.
    Seulement, il y a une chose à laquelle il faut faire attention, c'est que quand on supprime une ligne, toutes celles qui suivent changent de positions, forcément. Si on supprime la ligne 100, la ligne 101 se retrouve en 100 ! Une façon simple de prendre en compte ça et de supprimer les lignes en partant de la dernière : comme supprimer une ligne ne change que ce qui se trouve après, et pas ce qui se trouve avant, on n'a plus ce problème quand on va de la fin vers le début.
    Donc, on peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int j=i; j>positionTitre; j--) {
        lignes.remove(j);
    }
    De la même façon, comme on n'était entrain de traiter la ligne i, et que celle-ci n'existe plus, ni même certaines ligne avant, la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0; i<lignes.size(); i++) {
    }
    va avoir un problème similaire, d'autant plus que pour boucler on va faire i++.
    Par exemple, imagine que le titre incomplet soit en 100, que la ligne avec score soit en 102, on supprime donc 101 et 102, et la ligne 103 devient la ligne 101, alors que i vaut 102, et puis 103 lorsqu'on va boucler. Donc il faut décaler i pour pouvoir poursuivre correctement la boucle.
    Le décaler simplement en arrière de façon à ce qu'on soit comme si on était entrain de traiter encore le titre. Donc de faire :
    En reprendant l'exemple ci-avant, i va valoir 100. puis lorsqu'on va boucler, on va faire i++, i va valoir 101. Donc on va bien traiter la ligne suivante (celle qui suivait avant, celle qui avant était en 103).
    Enfin, comme on fait un traitement particulier lorsque positiontitre!=-1 parce que çà veut dire qu'on est en train de traiter un titre incomplet, il ne faut plus le faire, puisque justement on a fini de traiter le titre incomplet, soit :
    Donc en résumé :

    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
    nt positiontitre=-1; // on utilise -1 pour indiquer qu'on n'a pas de titre
    for(int i=0; i<lignes.size(); i++) {
     
         if ( pattern.matcher(ligne).matches() && !ligne.contains("(Scored)") && !ligne.contains("(Not Scored)") ) {
              positiontitre = i; // on a détecter un titre incomplet, donc on stocke sa position
         }
         else if ( positiontitre!=-1 ) { // on sait qu'on a un titre incomplet à complèter...
             if ( ligne.contains("(Scored)") || ligne.contains("(Not Scored)") ) { // on détecte si on a la fin du titre
                 // ici on a la fin du titre, et on sait qu'il est en i
                 // donc maintenant on va regrouper toutes les lignes entre positiontitre et i, et on passera au titres suivants
                 StringBuilder sb = new StringBuilder();
                 for(int j=positiontitre; j<=i; j++) {
     
                      if ( sb.length()>0 ) { // si on a déjà quelque chose dans le StringBuilder, on ajouter un retour chariot pour passer à la ligne
                           sb.append("\n");
                      }
                      sb.append(lignes.get(j));
                 }
                 String titrecomplet = sb.toString();
     
                 lignes.set(positionTitre, titreComplet);
                 for(int j=i; j>positionTitre; j--) {
                      lignes.remove(j);
                 }
                 i=positionTitre;
                 positionTitre = -1;
     
             }
         }
     
    }
    Maintenant on se retrouve bien avec un texte tels ques tous les titres sont dans un seul item de la liste, donc le code qui traitent item par item la liste va fonctionner sans avoir à le changer.


    PS. au fait, j'ai relu l'un de tes derniers codes.... et y'a un truc que je n'avais pas remarqué. C'est quoi ce machin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern pattern2 = Pattern.compile("[0-9].*?.*[0-9].*$"); // récupérer toute la ligne qui contient par exemple 1.1 ..
    ?
    ça sert à quoi ? A part à faire n'importe quoi ? Et certainement pas ce qui est écrit en commentaire
    Parce que ta regexpl, elle cherche :
    • un chiffre unique
    • suivi de n'importe quel caractère un nombre quelconque de fois (de 0 à l'infini), mais en s'arrêntant au premier truc qui matche la suite
    • suivi d'un chiffre unique
    • suivi de n'importe quel caractère un nombre quelconque de fois (de 0 à l'infini)
    • tout ça en fin de ligne

    ça donne juste un truc qui ressemble à pas du n'importe quoi parce qu'on fait un matche sur une regexp qui elle est correcte : on a une ligne qui commence forcément par un chiffre et que se termine par des caractères, et qu'il y par hasard d'autres chiffres dedans qui sont bien séparés par aucun caractère entre (et encore si ton titre c'était juste "1. titre", et bien, ça ne fonctionnerait pas.

    Mais c'est complètement inutile et surtout inutilement compliqué puisqu'on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maps.put(ligne, paragraphe);
    pour faire la même chose. Et qu'en plus ce code a au moins du sens.
    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.

  5. #25
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Super explication

    J'ai pas besoin de stocker le 1.titre dans ce cas.

    Mais, Ou serait-il le résultat final qui contient le titre et le contenu du paragraphe ?

    Merci encore,

  6. #26
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Mais, Ou serait-il le résultat final qui contient le titre et le contenu du paragraphe ?
    Au même endroit qu'avant !!! C'est le but de ce qu'on vient de faire Pour que le code qu'on faisait avant donne le même résultat qu'avant malgré ces titres multilignes...

    Donc après on continue de faire :
    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
    Map<String, List<String>> maps = new LinkedHashMap<>();
    			Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");  
     
     
    			List<String> paragraphe = new ArrayList<>();
    			maps.put(null, paragraphe);  // lignes avant le premier titre de section
     
    				for(String ligne : lignes) {  // parcoure ligne par ligne du texte 
     
    					if ( patternPage.matcher(ligne).matches() ) continue; // ignore les lignes page
     
    					Matcher matcher = pattern.matcher(ligne);   // ici le matching de la ligne
     
    					if (matcher.matches()) {  // changement de section
     
    						paragraphe = new ArrayList<>();  
    						maps.put(ligne, paragraphe);
    						paragraphe.add(ligne);  
     
    					} else {
    						paragraphe.add(ligne);  
    					}
     
    				}
    Et donc on a dans la map des paragraphes en valeur associé à leur titre respectif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (Map.Entry<String, List<String>> entry : maps.entrySet()) {
    // affichage du titre :
    System.out.println(entry.getKey());
    // affichage du paragraphe :
    for(String ligne : entry.getValue()) {
    System.out.println( ligne );
    }
    // on pourrait construire le texte du paragraphe comme ça :
    //String textSection = entry.getValue().stream().collect(Collectors.joining("\n"));
    }
    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.

  7. #27
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Merci pour ton aide Monsieur,

    J'ai bien les titres (Scored et aussi Not Scored) et le contenu des paragraphe.

    J'ai essayé d'afficher les titres qui sont Scored et leurs contenu :
    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
    
    //parcourir le map
    	  for (Map.Entry<String, List<String>> entry : maps.entrySet())
    	  {
    		   
    		  if (entry.getKey().contains("(Scored)")) // null
    		   {
    
    			 // affichage du titre (Scored): 
    			   System.out.println("***Titre** "+entry.getKey());
    			 
    			// affichage du paragraphe :
    			for(String ContenuParagraphe : entry.getValue())
    			{
    			   System.out.println( "***paragraphe** "+ContenuParagraphe );
    			}
    			
    		     // on pourrait construire le texte du paragraphe comme ça :
    			//String textSection = entry.getValue().stream().collect(Collectors.joining("\n"));
            }
    	 }
    Mais l'utilisation de la fonction "entry.getKey().contains("(Scored)")" est tourjours null j'en sais pas pourquoi?

    Pour savoir s'il y a un problème au niveau de cette fonction, j'ai testé d'une autre façon DEMO . Elle fonctionne et j'ai le bon résultat.

    Merci corriger ce probléme

  8. #28
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Mais l'utilisation de la fonction "entry.getKey().contains("(Scored)")" est tourjours null j'en sais pas pourquoi?
    J'ai résolu le problème de récupération des titres Scored a travers de l'ajout du boucle if au sein de matching des lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(ligne.contains("(Scored)"))
    {
      maps.put(ligne, paragraphe); //on stocke  le titre de paragraphe
     }
    J'ai rencontré un autre type de problème car je dois stocker le titre et leur contenu de paragraphe dans ma base de données. Puisque tous le contenu est séparé par "\n" donc il ajout dans ma base de données ligne par ligne. Mais, je veux que chaque ligne dans la table contient titre (8.1.18 Make the Audit Configuration Immutable (Scored)) et le contenu de son paragraphe (Profile Applicability: Level 2...).

    Donc, j'ai enlevé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if ( sb.length()>0 ) { // si on a déjà quelque chose dans le StringBuilder, on ajouter un retour chariot pour passer à la ligne
    		    sb.append("\n");
      }
    Lors de parcoure de Map, il m'affiche que "entry.getKey()" est NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.NullPointerException: null
    Comment enlever le retourne à la ligne (je pense qu'il rend le traitement non fonctionnel)? Alors, comment faire le lien entre la séparation entre le titre et le paragraphe et mettre le contenu de paragraphe dans une seule variable pour le stocker après dans la BD?

  9. #29
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le problème se situe ici : maps.put(null, paragraphe); // lignes avant le premier titre de section. Tu dois exclure cette partie, sans titre (hors section).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( entry.getKey()!=null ) {...}
    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.

  10. #30
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    J'ai résolu le problème de récupération des titres Scored a travers de l'ajout du boucle if au sein de matching des lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(ligne.contains("(Scored)"))
    {
      maps.put(ligne, paragraphe); //on stocke  le titre de paragraphe
     }
    Il faut faire ça en aval, pas dans la construction, sinon tu vas fusionner les sections not scored dans la section scored précédente.
    Au passage, un if n'est une boucle

    Citation Envoyé par syrine01 Voir le message
    J'ai rencontré un autre type de problème car je dois stocker le titre et leur contenu de paragraphe dans ma base de données. Puisque tous le contenu est séparé par "\n" donc il ajout dans ma base de données ligne par ligne. Mais, je veux que chaque ligne dans la table contient titre (8.1.18 Make the Audit Configuration Immutable (Scored)) et le contenu de son paragraphe (Profile Applicability: Level 2...).

    Donc, j'ai enlevé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if ( sb.length()>0 ) { // si on a déjà quelque chose dans le StringBuilder, on ajouter un retour chariot pour passer à la ligne
    		    sb.append("\n");
      }
    Oui, c'est ce qu'il fallait faire, comme indiqué dans mon commentaire.

    Citation Envoyé par syrine01 Voir le message
    Lors de parcoure de Map, il m'affiche que "entry.getKey()" est NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.NullPointerException: null
    Réponse dans mon message précédent.

    Citation Envoyé par syrine01 Voir le message
    Comment enlever le retourne à la ligne
    QUel retour à la ligne ?
    Citation Envoyé par syrine01 Voir le message
    (je pense qu'il rend le traitement non fonctionnel)?
    Quoi ?
    Citation Envoyé par syrine01 Voir le message
    Alors, comment faire le lien entre la séparation entre le titre et le paragraphe et mettre le contenu de paragraphe dans une seule variable pour le stocker après dans la BD?
    Le lien entre la séparation du titre et du paragaphe ? Qu'est-ce que ça veut dire ?
    Mettre le contenu du paragraphe dans une seule String tu veux dire.
    Je rappelle que dans l'entry, tu as en clef le titre et en valeur, la liste des lignes du paragraphe.
    Je t'ai même mis en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // on pourrait construire le texte du paragraphe comme ça :
    //String textSection = entry.getValue().stream().collect(Collectors.joining("\n"));
    Si tu ne veux pas de passage à la ligne entre chaque ligne du paragraphe, tu veux remplacer le "\n" par une espace (" "). On pourrait ne rien mettre, mais je pense que ça risque de coller des mots (le mot en fin d'une ligne avec le premier de la ligne suivante). Après, on a un risque d'avoir deux espaces entre certaines lignes. Pour l'éviter on pourrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String textSection = entry.getValue().stream().
    .map(String::trim) // va supprimer toutes les espaces devant et derrière
    collect(Collectors.joining(" ")); // va assembler toutes les lignes avec une espace entre chaque
    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.

  11. #31
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Merci beaucoup monsieur tous çà marche bien sauf qu'un seul problème que j'ai rencontré lors de la vérification d'extraction du texte en titre et en paragraphe.

    J'ai constaté un faut coupage de contenu dans un paragraphe. C'est -à-dire , j'ai le paragraphe suivant;
    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
    Profile Applicability:
    Level 1
    Description:
    When enabled, this feature logs packets with un-routable source addresses to the kernel log.
    Rationale:
    Enabling this feature and logging these packets allows an administrator to investigate the possibility that an attacker is sending spoofed packets to their server.
    Audit:
    Perform the following to determine if suspicious packets are logged. # /sbin/sysctl net.ipv4.conf.all.log_martians net.ipv4.conf.all.log_martians = 1 # /sbin/sysctl net.ipv4.conf.default.log_martians net.ipv4.conf.default.log_martians = 1
    Remediation:
    Set 
    the net.ipv4.conf.all.log_martians and net.ipv4.conf.default.log_martians parameters to 
    1 in /etc/sysctl.conf:
     net.ipv4.conf.all.log_martians=1 net.ipv4.conf.default.log_martians=1
    Modify active kernel parameters to match: # /sbin/sysctl -w net.ipv4.conf.all.log_martians=1 # /sbin/sysctl -w net.ipv4.conf.default.log_martians=1 # /sbin/sysctl -w net.ipv4.route.flush=1
    Après exécution du programme, j’obtiens le résultat suivant;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Profile Applicability:
    Level 1
    Description:
    When enabled, this feature logs packets with un-routable source addresses to the kernel log.
    Rationale:
    Enabling this feature and logging these packets allows an administrator to investigate the possibility that an attacker is sending spoofed packets to their server.
    Audit:
    Perform the following to determine if suspicious packets are logged. # /sbin/sysctl net.ipv4.conf.all.log_martians net.ipv4.conf.all.log_martians = 1 # /sbin/sysctl net.ipv4.conf.default.log_martians net.ipv4.conf.default.log_martians = 1
    Remediation:
    Set 
    the net.ipv4.conf.all.log_martians and net.ipv4.conf.default.log_martians parameters to
    Donc, on remarque tous le texte après "parameters to ...." il est exclure car la ligne suivante commence par un chiffre "1 in /etc/sysctl.conf:" et que notre matching permet de tester chaque ligne qui commence par "1.1. ......." . C'est vrai que j'ai pas besoin de récupérer le titre "1 ......" mais dans le paragraphe, je dois prendre en considération tous les lignes même s'elles commencent par un chiffre comme cette ligne:"1 in /etc/sysctl.conf:"

    Comment cela va-t-il se faire, puisque je ne connais pas bien le matching des chaines ?

    Merci encore une autre fois,

  12. #32
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, forcément, "1 in /etc/sysctl.conf:" matche l'expression régulière.
    On pourrait la modifier en Pattern.compile("^((\\d+\\.)+?(\\d+)) .*$");, ce qui imposera d'avoir au moins un 2 nombres dans le numéro. S'il n'y a aucun titre dont le numéro est moins de 3 nombres, ça fonctionnera. Autre solution, Pattern.compile("^((\\d+\\.)*?(\\d+)) .*?(\\(Scored\\))|(\\(Not Scored\\))$"); puisqu'un titre a forcément (Scored) ou (Not Scored) dedans.
    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.

  13. #33
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Oui, forcément, "1 in /etc/sysctl.conf:" matche l'expression régulière.
    On pourrait la modifier en Pattern.compile("^((\\d+\\.)+?(\\d+)) .*$");, ce qui imposera d'avoir au moins un 2 nombres dans le numéro.
    Merci Monsieur, mais ce matching il récupère la ligne qui commence par chiffre dans un paragraphe comme cet exemple: 1 in /etc/sysctl.conf:. Mais ce dernier affiche le titre et leur contenu de paragraphe plusieurs fois . Donc, j'ai une redondance de données dans ma BD.

    J'en sais pas pourquoi?

  14. #34
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Merci Monsieur, mais ce matching il récupère la ligne qui commence par chiffre dans un paragraphe comme cet exemple: 1 in /etc/sysctl.conf:. Mais ce dernier affiche le titre et leur contenu de paragraphe plusieurs fois . Donc, j'ai une redondance de données dans ma BD.
    J'en sais pas pourquoi?
    J'ai résolu ce problème d'ajout des données dans ma base de données. j'ai la redondance des données car j'ai mis le sauvegarde de l'objet dans la boucle

    Après une deuxième vérification de données, j'ai rencontré un notre problème dans l'extraction de contenu de paragraphe

    Par exemple j'ai ce texte suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    9.5 Restrict Access to the su Command (Scored)
    Profile Applicability:
     Level 1
    Description:
    The su command allows a user to run a command or shell as another user. The program has been superseded by sudo, which allows for more granular control over privileged access. Normally, the su command can be executed by any user. By uncommenting the pam_wheel.so statement in /etc/pam.d/su, the su command will only allow users in the wheel group to execute su.
    ........
    10 User Accounts and Environment 
    This section provides guidance on setting up secure defaults for system and user accounts 
    and their environment. 
    Le texte ci-dessus contient une section (titre et paragraphe) et après la fin du paragraphe in the wheel group to execute su. j'ai une nouvelle section qui commence 10 User Accounts and Environment ...... .

    Alors, si j'élimine le traitement de titre qui commence par un seul chiffre 10 User Accounts and Environment ...... j'aurai donc une partie de contenu de paragraphe qui est exclure comme le cas précédent :

    Citation Envoyé par syrine01 Voir le message
    Donc, on remarque tous le texte après "parameters to ...." il est exclure car la ligne suivante commence par un chiffre "1 in /etc/sysctl.conf:" et que notre matching permet de tester chaque ligne qui commence par "1.1. ......." . C'est vrai que j'ai pas besoin de récupérer le titre "1 ......" mais dans le paragraphe, je dois prendre en considération tous les lignes même s'elles commencent par un chiffre comme cette ligne:"1 in /etc/sysctl.conf:"
    je pense qu'il faut pris en considération les titres commençant par un chiffre 1 User Accounts and Environment et leur paragraphe.

    Le problème ici, comment savoir si la ligne qui comment par un seul chiffre 1 User Accounts and Environment est un vrai titre ou bien il fait partie de contenu du parapgraphe?

    Merci,

  15. #35
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    L'expression "^((\\d+\\.)+?(\\d+)) .*$" ne matche ni "1 in /etc/sysctl.conf", ni "10 User Accounts and Environment". J'ai évoqué ce problème en suggérant d'utiliser la présence de (Scored) et (Not Scored). Pourquoi ce titre n'en contient pas ? Si tous les titres ne sont pas d'une forme idenfiable et distincte d'autres parties du texte, il est impossible de les distinguer et de les détecter. Il faudrait voir si on ne peut pas intervenir au niveau de l'extraction. Tu peux me joindre le pdf d'origine pour voir ?
    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.

  16. #36
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Bonjour Monsieur,

    Oui le problème est comment distinguer la ligne qui commence par un seul chiffre est un vrai titre ou non?

    Je pense qu'il faut séparer le titre "1 ...." et son paragraphe comme les autres sous titres "1.2. ...."

    Ci-joint le document PDF.
    Images attachées Images attachées
    • Type de fichier : pdf 01.pdf (1,96 Mo, 112 affichages)

  17. #37
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Oui le problème est comment distinguer la ligne qui commence par un seul chiffre est un vrai titre ou non?
    "1 in /etc/sysctl.conf" commence par un nombre et n'est pas un titre

    On pourrait se servir de la table des matières pour déterminer les titre.
    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.

  18. #38
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    "1 in /etc/sysctl.conf" commence par un nombre et n'est pas un titre

    On pourrait se servir de la table des matières pour déterminer les titre.
    Comment déterminer la page de sommaire et la vérification des titres?

    Merci,

  19. #39
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par syrine01 Voir le message
    Comment déterminer la page de sommaire et la vérification des titres?
    Ce sont toutes les lignes entre "Table of Contents" et "Overview". Donc tu parcours les lignes jusqu'à une ligne égale à "Table of Contents", puis tu parcours les lignes jusqu'à trouver une ligne égale à "Overview". Pendant ce second parcours, tu élimines les lignes qui servent de numéro de page (expression que j'ai déjà donnée), et les autres lignes, tu les formattes correctement (tu supprimes les .... qu'il y a à la fin, les espaces en trop, tout ça) et les lignes que tu obtiens, tu les stockes par exemple dans un Set. Il n'y a donc plus qu'à parcourir le reste des lignes comme avant, et au lieu d'utiliser une expression régulière pour savoir si on a un titre, on utilise la méthode Set.contains().
    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.

  20. #40
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Merci pour ta proposition,

    j'ai essayé de le construire en pratique, mais j'ai rencontré des difficiles et je trouverais qu'il est compliqué.

    Merci monsieur de me corriger mon essai car il ne représente pas le résultat exacte.

    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
     
     List<String> lignes = Files.readAllLines(Paths.get("src\\main\\resources\\static\\pdf\\extractPDF.txt"));
    
    		  Pattern patternPage = Pattern.compile("^\\d+ \\| P a g e.*$"); 
     
    		   TreeSet sortedSet = new TreeSet<String>(); // création de Set
    
    		 for(String ligne : lignes)  //parcours des lignes
    		 { 
    		    do
    		    {
    		 	   patternPage.matcher(ligne).matches(); // suppression des numéros des pages
    		 	   
    		 	  int index1=ligne.lastIndexOf('.');//retourne last index de '.' 
    		 	  
    		 	  sortedSet.add(ligne.substring(index1)); //Stockage des lignes obtenus 
    		    }
    		    while(ligne.contains("Table of Contents") && ligne.contains("Overview"));   // parcours des lignes entre "Table of Contents" et "Overview"
    
                
    		    int positiontitre=-1; // on utilise -1 pour indiquer qu'on n'a pas de titre
    			
    			for(int i=0; i<lignes.size(); i++) {
    			 
    			     if ( sortedSet.contains("on met quoi ici pour savoir s'il y a un titre ou non?") && !ligne.contains("(Scored)") && !ligne.contains("(Not Scored)") ) 
                                      {
    			    	 
    			          positiontitre = i; // on a détecter un titre incomplet, donc on stocke sa position
    			     }
    			     else if ( positiontitre!=-1 ) { // on sait qu'on a un titre incomplet à complèter...
    			    	 
    			         if ( ligne.contains("(Scored)") || ligne.contains("(Not Scored)") ) { // on détecte si on a la fin du titre
    			             // ici on a la fin du titre, et on sait qu'il est en i
    			             // donc maintenant on va regrouper toutes les lignes entre positiontitre et i, et on passera au titres suivants
    			            
    			        	 StringBuilder sb = new StringBuilder();
    			             
    			             for(int j=positiontitre; j<=i; j++) {
    
    			                  sb.append(lignes.get(j));
    			             }
    			             String titrecomplet = sb.toString();
    			 
    			             lignes.set(positiontitre, titrecomplet);
    			             for(int j=i; j>positiontitre; j--) {
    			                  lignes.remove(j);
    			             }
    			             i=positiontitre;
    			             positiontitre = -1;
    			 
    			         }
    			     }
    			 
    			}
    		 }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [FPDF] Extraire le texte d'un fichier PDF
    Par brune38 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/10/2009, 11h26
  2. [phpToPDF] Récupérer le contenu texte d'un fichier PDF
    Par Chikh001 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/11/2007, 12h40
  3. Récupération de données à partir des fichiers bruts
    Par grinder59 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 23/07/2007, 15h44
  4. [FPDF] ajout texte dans un fichier pdf modèle?
    Par moabomotal dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/06/2006, 17h36
  5. modifier le texte d'un fichier pdf
    Par spilliaert dans le forum Documents
    Réponses: 2
    Dernier message: 24/05/2006, 00h19

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