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. #1
    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 Mauvaise récupération de texte à partir du fichier .PDF
    Bonjour,

    je suis entrain de faire une API en java qui perment d'extraire les données spécifique depuis un document .PDF envoyé par l'utilisateur.

    D'aprés la recherche sur l'internet , j'ai trouvé qu'il est difficile de le faire.

    J'ai la structure de text suivant qui'est fixe:
    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
    2.1 Create Separate Partition for /tmp (Scored)
    Profile Applicability:
    Level 1
    Description:
    The /tmp directory is a world-writable directory used for temporary storage by all users and some applications.
    Rationale:
    Since the /tmp directory is intended to be world-writable, there is a risk of resource exhaustion if it is not bound to a separate partition. In addition, making /tmp its own file system allows an administrator to set the noexec option on the mount.
     
    Remediation:
    For new installations, during installation create a custom partition setup and specify a separate partition for /tmp.
    References:
    1. AJ Lewis, "LVM HOWTO",
    2.2 Set nodev option for /tmp Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nodev mount option specifies that the filesystem cannot contain special devices.
    Rationale:
    Since the /tmp filesystem is not intended to support devices, set this option to ensure that users cannot attempt to create block or character special devices in /tmp.
    Remediation:
    Edit the /etc/fstab file and add nodev to the fourth field (mounting options). See the fstab(5) manual page for more information.
    2.3 Add nodev Option to Removable Media Partitions (Not Scored)
    Profile Applicability:
    Level 1
    Description:
    Set nodev on removable media to prevent character and block special devices that are present on the removable media from being treated as device files.
    Rationale:
    Removable media containing character and block special devices could be used to circumvent security controls by allowing non-root users to access sensitive device files such as /dev/kmem or the raw disk partitions.
    Remediation:
    Edit the /etc/fstab file and add "nodev" to the fourth field (mounting options). 
    2.4 Add nosuid Option to /run/shm Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nosuid mount option specifies that the /run/shm (temporary filesystem stored in memory) will not execute setuid and setgid on executable programs as such, 
    Rationale:
    Setting this option on a file system prevents users from introducing privileged programs onto the system and allowing non-root users to execute them.
    Remediation:
    Edit the /etc/fstab file and add nosuid to the fourth field (mounting options).
    Donc, je cherche a récupérer le contenu de tous sections qui contient le mot "( Scored)", par exemple ce texte:
    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
    2.1 Create Separate Partition for /tmp (Scored)
    Profile Applicability:
    Level 1
    Description:
    The /tmp directory is a world-writable directory used for temporary storage by all users and some applications.
    Rationale:
    Since the /tmp directory is intended to be world-writable, there is a risk of resource exhaustion if it is not bound to a separate partition. In addition, making /tmp its own file system allows an administrator to set the noexec option on the mount.
    
    Remediation:
    For new installations, during installation create a custom partition setup and specify a separate partition for /tmp.
    References:
    1. AJ Lewis, "LVM HOWTO",
    2.2 Set nodev option for /tmp Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nodev mount option specifies that the filesystem cannot contain special devices.
    Rationale:
    Since the /tmp filesystem is not intended to support devices, set this option to ensure that users cannot attempt to create block or character special devices in /tmp.
    Remediation:
    Edit the /etc/fstab file and add nodev to the fourth field (mounting options). See the fstab(5) manual page for more information.
    2.4 Add nosuid Option to /run/shm Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nosuid mount option specifies that the /run/shm (temporary filesystem stored in memory) will not execute setuid and setgid on executable programs as such, 
    Rationale:
    Setting this option on a file system prevents users from introducing privileged programs onto the system and allowing non-root users to execute them.
    Remediation:
    Edit the /etc/fstab file and add nosuid to the fourth field (mounting options).
    
    The idea is to browse each line to find the word "Scored" if it exists and not. Then take their position to split the text using the substring.
    L'idée est de parcourir chaque ligne pour chercher le mot "(Scored)" s'il existe et non. Puis en va prendre leur position pour découper le texte en utilisant le substring.

    Voici mon code:
    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
     
    public Boolean ExtractPDF() {
     
     String text = "2.1 Create Separate Partition for /tmp (Scored)
    Profile Applicability:
    Level 1
    Description:
    The /tmp directory is a world-writable directory used for temporary storage by all users and some applications.
    Rationale:
    Since the /tmp directory is intended to be world-writable, there is a risk of resource exhaustion if it is not bound to a separate partition. In addition, making /tmp its own file system allows an administrator to set the noexec option on the mount.
     
    Remediation:
    For new installations, during installation create a custom partition setup and specify a separate partition for /tmp.
    References:
    1. AJ Lewis, "LVM HOWTO",
    2.2 Set nodev option for /tmp Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nodev mount option specifies that the filesystem cannot contain special devices.
    Rationale:
    Since the /tmp filesystem is not intended to support devices, set this option to ensure that users cannot attempt to create block or character special devices in /tmp.
    Remediation:
    Edit the /etc/fstab file and add nodev to the fourth field (mounting options). See the fstab(5) manual page for more information.
    2.3 Add nodev Option to Removable Media Partitions (Not Scored)
    Profile Applicability:
    Level 1
    Description:
    Set nodev on removable media to prevent character and block special devices that are present on the removable media from being treated as device files.
    Rationale:
    Removable media containing character and block special devices could be used to circumvent security controls by allowing non-root users to access sensitive device files such as /dev/kmem or the raw disk partitions.
    Remediation:
    Edit the /etc/fstab file and add "nodev" to the fourth field (mounting options). 
    2.4 Add nosuid Option to /run/shm Partition (Scored)
    Profile Applicability:
     Level 1
    Description:
    The nosuid mount option specifies that the /run/shm (temporary filesystem stored in memory) will not execute setuid and setgid on executable programs as such, 
    Rationale:
    Setting this option on a file system prevents users from introducing privileged programs onto the system and allowing non-root users to execute them.
    Remediation:
    Edit the /etc/fstab file and add nosuid to the fourth field (mounting options).";
     
    String wordToFind = " (Scored)"; 
    Pattern word = Pattern.compile(wordToFind);
    Matcher match = word.matcher(text);
     
    for(int i=0; i<= text.length(); i++){
     
        while (match.find() && text.toLowerCase().contains(wordToFind.toLowerCase())==true ) {
                           // System.out.println("Found love at index "+ match.start() +" - "+ (match.end()-1));
                           String res = text.substring(match.start()+1 , match.end());
                           System.out.println("****"+ res); // ****Scored
     
        }
     }
    }
    Mais ce code il affiche ceci "****Scored"

    je suis débutant en java et j'en sais pas comment récupérer le bon texte comme j'ai défini en début de sujet.

    Merci de m'aider mes amis.

  2. #2
    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
    Salut

    1. String wordToFind = " (Scored)"; : définir un motif d'expression régulière. Problème : ( et ) sont des caractères signifiants. Si tu cherches le mot " (Scored)", il faut les échapper : " \\(Scored\\)".

    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Pattern word = Pattern.compile(wordToFind);
      Matcher match = word.matcher(text);
      ça ok
    3. for(int i=0; i<= text.length(); i++){ là tu boucles sur tous les caractères du text, y compris un caractère qui n'existe pas après sa fin (le = du <=). Ce qu'il faut c'est uniquement boucler sur les mots trouvés, pas sur la chaîne complète. while (match.find()) suffit pour ça.
    4. while (match.find() && text.toLowerCase().contains(wordToFind.toLowerCase())==true ) {A chaque fois qu'on trouve un mot qui correspond au motif (match.find() ) et que le mot est contenu dans le text, quelque soit la casse ( text.toLowerCase().contains(wordToFind.toLowerCase())==true ). A quoi sert la deuxième condition ? Et pourquoi l'exécuter à chaque fois qu'on trouve le mot. Le texte ne change pas pendant la boucle while... Et puis elle ne sert à rien cette condition. Si tu as besoin de faire le matching sans tenir compte de la casse, Pattern.compile(wordToFind,Pattern.CASE_INSENSITIVE)
    5. String res = text.substring(match.start()+1 , match.end()); : il y a de l'idée, mais là tu affiches le mot trouvé, alors qu'il me semble que ce que tu veux, c'est les sous sections qui contiennet "(Scored)".

      Pour faire le découpage (avoir les chaînes entre les " (Scored)", le plus simple serait encore d'utiliser un split :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      String[] split = text.split(" \\(Scored\\)");
      ou
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      String[] split = text.split("(?i) \\(Scored\\)");
      pour être insenssible à la case.

      Maintenant quand tu parles de "section" qui contient "(Scored)", je ne suis pas sûr que quoi tu parles. On pourrait facilement avoir les lignes qui contiennent le mot (les titres des sections à priori) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Arrays.stream(text.split("\n")).filter(l->l.matches(".*\\(Scored\\)")).forEach(System.out::println);
      Qu'est-ce qui définit une section pour toi ?


    En revanche, je suppose que c'est pour tester que tu as mis le texte en dur dans le code, mais tel quel ça ne fonctionnera pas. Il y a déjà tous les " qu'il va falloir échapper, et les lignes qu'il va falloir concaténer entre elles sans oublier le retour chariot. Assez fastidieux. Je serais toi, je mettrais le texte dans un fichier texte et je le chargerais à la volée. Et là, tu peux même directement faire un traitement ligne à ligne même sans passer par une String inermédiaire (avec Files.lines()).
    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. #3
    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 explication monsieur,

    Qu'est-ce qui définit une section pour toi ?
    j'ai des documents .PDF basé sur la même structure que j'ai définis dans le sujet précédent.
    L'idée générale est de récupérer chaque paragraphe qui contient dans leur titre le mot " (Scored)", par exemple comme le texte 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
     
    2.1 Create Separate Partition for /tmp (Scored)
    Profile Applicability:
    Level 1
    Description:
    The /tmp directory is a world-writable directory used for temporary storage by all users and some applications.
    Rationale:
    Since the /tmp directory is intended to be world-writable, there is a risk of resource exhaustion if it is not bound to a separate partition. In addition, making /tmp its own file system allows an administrator to set the noexec option on the mount.
     
    Remediation:
    For new installations, during installation create a custom partition setup and specify a separate partition for /tmp.
    References:
    AJ Lewis, "LVM HOWTO"
     
    2.2. ...........
    J'en sais pas comment définir le début et le fin de chaque paragraphe (section) pour récupérer leur 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    String text = "2.9 Create Separate Partition for /home (Scored) Profile Applicability: "
    	        		+ " Level 1 Description: he /home directory is used to support disk storage needs of local users."
    	        		+ " 2.10 Add nodev Option to /home (Scored) "
    	        		+ "Profile Applicability: Level 1 "
    	        		+ "Description:When set on a file system, this option prevents character and block"
    	        		+ " special devices from being defined, or if they exist, from being used as character and block special devices."
    	        		+ "Rationale: Since the user partitions are not intended to support devices, "
    	        		+ "set this option to ensure that users cannot attempt to create block or character special devices."
    	        		+"2.11 Add nodev Option to Removable Media Partitions (Not Scored)"
    	        		+"Profile Applicability: Level 1"
    	        		+"Description:Set nodev on removable media to prevent character and block special devices that are present "
    	        		+ "on the removable media "
    	        		+ "from being treated as device files."
    	        		+"Rationale: Removable media containing character and block special devices could be used to"
    	        		+"circumvent security controls by allowing non-root users to access sensitive device files"
    	        		+"such as /dev/kmem or the raw disk partitions.";
     
    	        String wordToFind = " \\(Scored\\)"; 
     
                     Pattern word = Pattern.compile(wordToFind);
    	         Matcher match = word.matcher(text);
     
                      while (match.find()) 
    	                {
    	        	         /**
                                       * comment définir le début et le fin de chaque paragraphe dont leur titre contenant le mot " (Scored)"
                                       *       
                                       */
     
    	                }
    Si par exemple je change la méthode de récupération c'est à dire j'extraire tous le texte du document .PDF et je le stocke dans un fichier .txt. est-il possible de récupérer le texte d'une paragraphe ( leur titre contient "(Scored)") ? si oui, merci de m'envoyer un exemple.

  4. #4
    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
    Je suppose que tu utilises une méthode simple qui extrait le texte brut du PDF (avec iText ou PDFbox), du coup tu perds la structure de paragraphe. Il faudrait écrire toute la procédure de parcours du pdf pour insérer des marqueurs, en s'inspirant du code d'extraction. Cela risque d'être beaucoup de boulot, et cela risque même de ne pas fonctionner à 100%, par la notion de paragraphe dans un PDF est technique, pas rédactionnelle.

    Le plus simple, à mon avis, est de se basée sur la structure de la titraille. Faire un traitement par ligne : donc parcourir toutes les lignes du textes. Pour chaque ligne regarder si la structure est celle d'un titre. Soit quelque chose de la forme "une suite de nombres séparés par des points, suivi d'une espace, suivi d'un texte". Tout le reste est du texte "simple".
    Ensuite on peut parser l'entête du titre pour connaitre le "niveau" de paragraphe. Ce qui permet de connaître la structure d'imbrication des sections : de connaitre les sous-sections en particulier.
    Si on part sur un règle : si un titre de section contient " (Scored)", alors on prend tous les paragraphes de son niveau plus tous les paragraphes de niveau inférieur y compris leur titre, récursivement, on devrait avoir quelque chose qui ressemble assez bien à une extraction de section tel que le titre contienne " (Scored)". Reste à savoir s'il existe des sous-section "scored" de section "scored", et que faire dans ce cas.

    Avec ce pattern, on devrait sélectionner les titres et extraire la partie numérotation : Pattern pattern = Pattern.compile("^((\\d\\.)*?(\\d)) .*$");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Matcher matcher = pattern.matcher(ligne);
    if ( matcher.matches() ) {
        String[] levels = matcher.group(1).split("\\."); 
    }
    Avec le split on récupère les différents niveaux de la numérotation. Il suffit de faire une petite méthode qui permet de tester si une section est dans une autre. L'algo est relativement simple :
    une section dont le numéro est int[] n est dans une autre dont le numéro est int[] m si
    1. le nombre de niveaux n est supérieur au nombre de niveaux m, soit si n.length>m.length
    2. si tous les m[i] tels que i<m.length sont égaux aux n[i]

    On peut ajouter la condition si n.length-m.length == 1, alors la section "n" est immédiatement dans "m".
    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. #5
    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 la solution mais je trouve qu'elle est un peu compliqué car j'ai pas utilisé avant la manipulation.

    Si on part sur un règle : si un titre de section contient " (Scored)", alors on prend tous les paragraphes de son niveau plus tous les paragraphes de niveau inférieur y compris leur titre, récursivement, on devrait avoir quelque chose qui ressemble assez bien à une extraction de section tel que le titre contienne " (Scored)".
    Je veux commencer étape par étape.

    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
     
    String text = "......."; // le texte que j'ai défini au début
     
     for(String ligne : text.split("\\n"))  // parcoure ligne par ligne du texte
     {
     
    	    	  Pattern pattern = Pattern.compile("^((\\d\\.)*?(\\d)) .*$"); // ici l'expression régulière  pour savoir s'il existe des chiffres ou bien des points (.)
     
    	    	  Matcher matcher = pattern.matcher(ligne); // ici le matching de la ligne
     
    	    	  if(ligne.contains(" (Scored)") == true)  // ici vérifier si la ligne contient le mot " (Scored)" donc on une paragraphe et son titre
    	    	  {		  
    	    	       if ( matcher.matches() )
                              {
    	    	    	   String[] levels = matcher.group(1).split("\\.");   // ceci retourne les numéros qui sont avant (.) par exemple 2.9 => j'ai  donc 2 et 9	   
     
                               /**
                                  * ici comment je peux récupérer le titre (contenant le mot " (Scored)") et le contenu de la paragraphe ?.
                                  */
    	    	          }
    	          }    	     	  
     }
    merci de m'aider,

  6. #6
    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
    ici comment je peux récupérer le titre (contenant le mot " (Scored)") et le contenu de la
    Bah le titre c'est la variable ligne.

    Ensuite, tu ne peux pas récupérer le contenu ici, puisqu'on est en train de parcourir les lignes, donc toutes ne le sont pas, et justement celle de la section à récupérer ne le sont pas encore.

    Effectivement, on peut simplifier sans passer par le split : on utilise juste matcher.group(1)+"." et un startsWith pour tester si on a une sous-section ou pas.

    On peut faire plus simple, mais la façon que je t'ai donnée est plus souple à manipuler parce qu'on obtient d'abord toutes les sections et sous section séparées, et ensuite on fait le tri "scored" vs "les autres", et on inclut ou pas les sous-section comme on veut.
    On fait d'abord :

    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
    Map<String, List<String > map = new HashMap<>();
    Pattern pattern = Pattern.compile("^((\\d\\.)*?(\\d)) .*$"); // ici l'expression régulière  pour savoir s'il existe des chiffres ou bien des points (.)
    List<String> paragraphe = new ArrayList<>();
    map.put(null, paragraphe); // on ne sait jamais dès fois qu'il y ait des lignes hors section au début du texte,
    for(String ligne : text.split("\\n")) {  // parcoure ligne par ligne du texte 
     
    	    	  Matcher matcher = pattern.matcher(ligne); // ici le matching de la ligne
     
          	          if ( matcher.matches() ) { // changement de section 
     
                               paragraphe = ArrayList<>(); // nouveau paragraphe
                               map.put( matcher.group(1), paragraphe );
                               paragraphe.add( ligne ); // on stocke le titre
     
    	    	  }
                      else {
                               paragraphe.add( ligne ); // on stocke la ligne
                      }
    }
    Et maintenant, dans la map tu as des sections bien séparées, tu peux donc les parcourir, et faire le test contains(" (Scored)") pour trouver les sections "scored". Ensuite on se sert de la clef dans la map pour déterminer les sous-sections au besoin.


    Mais si tu veux faire plus simple tu stockes un état qui dit "je suis en train de parcourir la section "scored" de numéro x" donc je dois récolter toutes les lignes que je rencontre jusqu'à ce que je rencontre la ligne de section suivante. Il suffit que la ligne maches l'expression régulière et ne commence pas le début du titre "scored" trouvé (ce que tu peux obtenir donc par matcher.group(1)).

    Cette façon de faire est plus simple effectivement, mais ne fonctionne que si une section c'est bien tout le contenu sous son titre, récursivement (sous section comprise), et s'il n'y a pas de sous-paragraphe scoré, voire non scoré. Comme tu n'as pas répondu à la question que je t'ai posée, je ne sais toujours pas comment tu voudrais gérer le cas.
    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. #7
    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 fais comme tu as , mais après test les sections ne sont pas séparé dans le Map c'est à dire il mis tous le texte dans un seul Key de Map:
    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
     
     
         Map<String, List<String>> maps = new HashMap<>();
    	        Pattern pattern = Pattern.compile("^((\\d\\.)*?(\\d)) .*$"); // ici l'expression régulière  pour savoir s'il existe des chiffres ou bien des points (.)
    	        List<String> paragraphe = new ArrayList<>();
    	        maps.put(null, paragraphe); // on ne sait jamais dès fois qu'il y ait des lignes hors section au début du texte,
     
    	        for(String ligne : text.split("\\n")) {  // parcoure ligne par ligne du texte 
     
    	        	    	  Matcher matcher = pattern.matcher(ligne); // ici le matching de la ligne
     
    	              	          if ( matcher.matches() ) { // changement de section 
     
    	                                   paragraphe = new ArrayList<>(); // nouveau paragraphe
    	                                   maps.put( matcher.group(1), paragraphe );
    	                                   paragraphe.add( ligne ); // on stocke le titre
     
    	        	    	  }
    	                          else {
    	                                   paragraphe.add( ligne ); // on stocke la ligne
    	                          }
    	        }
     
    	        // parcoure de map
    	        for (Entry<String, List<String>> key : maps.entrySet()) {
    	        	System.out.println("Key : " + key.toString() + " Value : " + maps.get(key));
    	        }
    le parcoure de Map affiche le résultat suivant:
    Key : null=[] Value : null
    Key : 2.9=[2.9 Create Separate Partition for /home (Scored) ..... 2.10 Add nodev Option to /home (Scored) Profile Applicability: .....]
    Moi je veux çà :

    Key : null=[] Value : null
    Key : 2.9=[2.9 Create Separate Partition for /home (Scored) ... et son contenu.. ]
    Key : 2.10=[2.10 Add nodev Option to /home (Not Scored) Profile Applicability: .... et son contenu..... ]
    Key : 2.11=[2.11 Add nodev Option to /home ( Scored) Profile Applicability: .... et son contenu..... ]
    .......

  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 : 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
    remplace for(String ligne : text.split("\\n")) { par for(String ligne : text.split("\n")) (j'ai copié collé ton code sans faire attention qu'il y avait une erreur)
    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 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 modifié ligne "for" comme tu as mais j'ai le méme résultat.

    Alors, j'ai ajouté "\n" dans le text comme ceci:
    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
    String text = "\n 2.9 Create Separate Partition for /home (Scored) Profile Applicability: "
    	        		+ " \n Level 1 Description: he /home directory is used to support disk storage needs of local users."
    	        		+ "\n 2.10 Add nodev Option to /home (Scored) "
    	        		+ " \n Profile Applicability: Level 1 "
    	        		+ "\n Description:When set on a file system, this option prevents character and block"
    	        		+ " special devices from being defined, or if they exist, from being used as character and block special devices."
    	        		+ " \n Rationale: Since the user partitions are not intended to support devices, "
    	        		+ "set this option to ensure that users cannot attempt to create block or character special devices."
    	        		+" \n 2.11 Add nodev Option to Removable Media Partitions (Not Scored)"
    	        		+" \n Profile Applicability: Level 1"
    	        		+"\n Description:Set nodev on removable media to prevent character and block special devices that are present "
    	        		+ "on the removable media "
    	        		+ "from being treated as device files."
    	        		+"Rationale: Removable media containing character and block special devices could be used to"
    	        		+"circumvent security controls by allowing non-root users to access sensitive device files"
    	        		+"such as /dev/kmem or the raw disk partitions.";
    Voici ce que j'obtiens comme résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Key : null=[,  2.9 Create Separate Partition for /home (Scored) Profile Applicability:  ,  Level 1 Description: he /home directory is used to support disk storage needs of local users.,  2.10 Add nodev Option to /home (Scored)  ,  Profile Applicability: Level 1 ,  Description:When set on a file system, this option prevents character and block special devices from being defined, or if they exist, from being used as character and block special devices. ,  Rationale: Since the user partitions are not intended to support devices, set this option to ensure that users cannot attempt to create block or character special devices. ,  2.11 Add nodev Option to Removable Media Partitions (Not Scored) ,  Profile Applicability: Level 1,  Description:Set nodev on removable media to prevent character and block special devices that are present on the removable media from being treated as device files.Rationale: Removable media containing character and block special devices could be used tocircumvent security controls by allowing non-root users to access sensitive device filessuch as /dev/kmem or the raw disk partitions.] Value : null
    est ce qu'il est nécessaire d'utiliser substring ou split?

  10. #10
    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. change la regexp par "^((\\d+\\.)*?(\\d+)) .*$ (parce que ça matche que les nombres de 1 chiffre sinon)
    2. mets les \n (passage à la ligne) en fin de ligne, et sans espace après, sinon la regexp ne risque pas de fonctionner puisqu'elle cherche des lignes qui commencent par un nombre !
    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. #11
    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
    Je trouve l'utilisation de l'expression régulière est difficile.

    Merci, j'obtiens ce que je veux comme résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Key : 2.11=[2.11 Add nodev Option to Removable Media Partitions (Not Scored) , Profile Applicability: Level 1 , Description:Set nodev on removable media to prevent character and block special devices that are present , on the removable media from being treated as device files.Rationale: Removable media containing character and block special devices could be used tocircumvent security controls by allowing non-root users to access sensitive device filessuch as /dev/kmem or the raw disk partitions.] Value : null
     
    Key : 2.10=[2.10 Add nodev Option to /home (Scored) , Profile Applicability: Level 1 , Description:When set on a file system, this option prevents character and block , special devices from being defined, or if they exist, from being used as character and block special devices. , Rationale: Since the user partitions are not intended to support devices,set this option to ensure that users cannot attempt to create block or character special devices. ] Value : null
     
    Key : 2.9=[2.9 Create Separate Partition for /home (Scored) Profile Applicability: , Level 1 Description: he /home directory is used to support disk storage needs of local users. ] Value : null
    J'ai pas compris pourquoi il commence en ordre décroissant? possible de faire l'ordre comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Key : 2.9=[2.9. .....]
    Key : 2.10=[2.10. ....]
    Key : 2.11=[2.11. ....]

    Dans notre cas statique de texte j'ai le "\n". Mais dans le cas d'un vrai texte récupéré depuis un document .PDF. Comment définir le retour a la ligne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(String ligne : text.split("\n")) {
    ...
    }

  12. #12
    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 pas compris pourquoi il commence en ordre décroissant? possible de faire l'ordre comme ceci:
    En réalité, avec une HashMap, il n'y a pas d'ordre. C'est un hasard si l'ordre est décroissant. Si tu veux conserver l'ordre naturel, le plus simple est d'utiliser une LinkedHashMap au lieu d'une HashMap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, List<String>> maps = new LinkedHashMap<>();
    Citation Envoyé par syrine01 Voir le message
    Dans notre cas statique de texte j'ai le "\n". Mais dans le cas d'un vrai texte récupéré depuis un document .PDF. Comment définir le retour a la ligne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(String ligne : text.split("\n")) {
    ...
    }
    Pour ça, ça risque d'être compliqué. Comment est structuré exactement le texte ? Peux-tu me montrer 2 sections successives par exemple pour voir comment ça s'enchâine.
    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. #13
    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,
    Citation Envoyé par joel.drigo Voir le message
    Pour ça, ça risque d'être compliqué. Comment est structuré exactement le texte ? Peux-tu me montrer 2 sections successives par exemple pour voir comment ça s'enchâine.
    Voici un exemple de texte récupéré directement depuis un document PDF :
    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
     
    146 | P a g e  
     
    13.8 Check User Dot File Permissions (Scored) 
    Profile Applicability: 
      Level 1 
    Description: 
    While the system administrator can establish secure permissions for users' "dot" files, the 
    users can easily override these. 
    Rationale: 
    Group or world-writable user configuration files may enable malicious users to steal or 
    modify other users' data or to gain another user's system privileges. 
    Audit: 
    #!/bin/bash 
    for dir in `/bin/cat /etc/passwd | /bin/egrep -v '(root|sync|halt|shutdown)' | 
    /usr/bin/awk -F: '($7 != "/usr/sbin/nologin") { print $6 }'`; do 
        for file in $dir/.[A-Za-z0-9]*; do 
            if [ ! -h "$file" -a -f "$file" ]; then 
                fileperm=`/bin/ls -ld $file | /usr/bin/cut -f1 -d" "` 
                if [ `echo $fileperm | /usr/bin/cut -c6 ` != "-" ]; then 
                    echo "Group Write permission set on file $file" 
                fi 
                if [ `echo $fileperm | /usr/bin/cut -c9 ` != "-" ]; then 
                    echo "Other Write permission set on file $file" 
                fi 
            fi 
        done 
    done 
    Remediation: 
    Making global modifications to users' files without alerting the user community can result 
    in unexpected outages and unhappy users. Therefore, it is recommended that a monitoring 
    policy be established to report user dot file permissions and determine the action to be 
    taken in accordance with site policy. 
    13.9 Check Permissions on User .netrc Files (Scored) 
    Profile Applicability: 
      Level 1 
    Description: 
    147 | P a g e 
     
    Remediation: 
    Making global modifications to users' files without alerting the user community can result 
    in unexpected outages and unhappy users. Therefore, it is recommended that a monitoring 
    policy be established to report user .netrc file permissions and determine the action to be 
    taken in accordance with site policy. 
    13.10 Check for Presence of User .rhosts Files ( Not Scored) 
    Profile Applicability: 
    148 | P a g e  
     
    .........

  14. #14
    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
    Il semble bien qu'il y a ait de retour-chariot (\r\n), sinon comment ça passerait à la ligne ? Là, tu me montres une sortie console n'est-ce-pas ? tu peux la rediriger dans un fichier et le mettre en pièce jointe ?
    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.

  15. #15
    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
    Il semble bien qu'il y a ait de retour-chariot (\r\n), sinon comment ça passerait à la ligne ? Là, tu me montres une sortie console n'est-ce-pas ? tu peux la rediriger dans un fichier et le mettre en pièce jointe ?
    Ci-joint un exemple d'extraction du document .PDF :
    Fichiers attachés Fichiers attachés

  16. #16
    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
    Donc, c'est bien ce que je disais, il y a a bien des séparateurs de lignes.

    A partir du fichier, tu peux directement récupérer les lignes : List<String> lignes = Files.readAllLines(Paths.get("extractPdf.txt")); pour les parcourir sans split.

    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
    List<String> lignes = Files.readAllLines(Paths.get("extractPdf.txt"));
     
    	 	Pattern patternPage = Pattern.compile("^\\d+ \\| P a g e.*$");  
     
    		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) {  
     
    				if ( patternPage.matcher(ligne).matches() ) continue; // ignore les lignes page
     
    				Matcher matcher = pattern.matcher(ligne);  
    				if (matcher.matches()) { 
     
    					paragraphe = new ArrayList<>();  
    					maps.put(matcher.group(1), paragraphe);
    					paragraphe.add(ligne);  
     
    				} else {
    					paragraphe.add(ligne);  
    				}
     
    			}
     
    		// parcours de map
    		for (Map.Entry<String, List<String>> entry : maps.entrySet()) {
    			System.out.println("Section : " + entry.getKey() + " lignes " + entry.getValue());
    			// String textSection = entry.getValue().stream().collect(Collectors.joining(System.lineSeparator()));
    		}
    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.

  17. #17
    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 une dernier question, je cherche a séparer le résultat final comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Section : 8.2.5 Configure rsyslog to Send Logs to a Remote Log Host (Scored)     lignes [Profile Applicability: , Level 1 , Description: , The rsyslog utility supports the ability to send logs it gathers to a remote log host running , syslogd(8) or to receive messages from remote hosts, reducing administrative overhead. , Rationale: , Storing log data]

    Voici mon essai du code :

    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
     
    Map<String, List<String>> maps = new LinkedHashMap<>();
    			Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");  
     
    			 Pattern pattern2 = Pattern.compile("[0-9].*?.*[0-9].*$"); // récupérer toute la ligne qui contient par exemple 1.1 ..
     
    			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
    					  Matcher matcher2 = pattern2.matcher(ligne); 
     
    					if (matcher.matches()) {  // changement de section
     
    						paragraphe = new ArrayList<>();  
    						maps.put(matcher2.group(0), paragraphe);
    						paragraphe.add(ligne);  
     
    					} else {
    						paragraphe.add(ligne);  
    					}
     
    				}
     
    				// parcours de map
    				for (Map.Entry<String, List<String>> entry : maps.entrySet()) {
    					System.out.println("Section : " + entry.getKey() + " lignes " + entry.getValue());
    					// String textSection = entry.getValue().stream().collect(Collectors.joining(System.lineSeparator()));
    				}
    J'obtiens ce résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Section : 9.3.3 Set Permissions on /etc/ssh/sshd_config (Scored)  lignes [9.3.3 Set Permissions on /etc/ssh/sshd_config (Scored) , Profile Applicability: ,   Level 1 , Description: , The /etc/ssh/sshd_config file contains configuration specifications for sshd. The , command below sets the owner and group of the file to root. , Rationale: ....]
    Merci de me corriger

  18. #18
    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
    J'aurais préféré que tu décrives le résultat attendu. Parce que me présenter deux résultats et m'obliger à en détecter les différences, c'est un peu comme me poser une enigme ! J'ai l'impression que la différence se situe au niveau du titre qui est aussi dans les lignes, mais peut-être qu'il y en a d'autres, d'autant plus que ce n'est pas même pas les mêmes sections.
    Si c'est bien le titre qui te gêne dans les lignes, soit tu n'ajoutes pas le titre dans les lignes, soit tu le supprimes des lignes à la récupération. Pour ne pas l'ajouter, et bien, il suffit de ne pas l'ajouter. Donc de retirer le paragraphe.add( ligne ); que j'avais commenté "on stocke le titre", comme ça le titre ne fait pas partie du paragraphe. Celui qui se trouve juste après maps.put(matcher2.group(0), paragraphe);. D'ailleurs cette ligne pourrait s'écrire maps.put(ligne, paragraphe);. Dans ton cas ça fonctionne par le hasard du fait que l'expression régulière matche l'ensemble de la ligne.
    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.

  19. #19
    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
    Salut,

    Merci pour la correction du code Monsieur.

    Je veux ajouter a l'expression "Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$") " régulière le retourne à la ligne car j'ai des sections qui sont retourné à la ligne comme cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    8.1.6 Record Events That Modify the System's Network
     Environment (Scored)
    D’après la modification du code j'obtiens le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Section : 8.1.6 Record Events That Modify the System's Network Environment  Content : [(Scored) , Profile Applicability: ,   Level 2  ........]

  20. #20
    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
    Tu ne peux pas faire ça. C'est même absurde ! Tu découpes un texte en lignes, il n'y a donc plus de retour chariot dans aucune des lignes obtenues !
    Le plus simple est de faire une première passe pour recomposer les titres. Si un titre est suivi d'une ligne qui n'est pas un titre mais contient "(Scored)", alors on fusionne les deux lignes, et donc on se retrouve bien avec des titres sur une ligne. Voire étendre la manip à plusieurs lignes de "titres". Eventuellement, si on est sûr que toutes les lignes de titre contiennent soit (Score) soit (Not scored), on peut faire un test de plus pour détecter la fin de ligne de titre et ignorer les autres.

    Ou alors il faut merger d'abord toutes les lignes (en conservant les passages à la ligne, et faire une regexp globale, non plus lignes à lignes.
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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, 10h26
  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, 11h40
  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, 14h44
  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, 16h36
  5. modifier le texte d'un fichier pdf
    Par spilliaert dans le forum Documents
    Réponses: 2
    Dernier message: 23/05/2006, 23h19

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