IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Extraction de bloc de données d'un fichier texte en java


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Extraction de bloc de données d'un fichier texte en java
    Bonjour à tous, je suis nouveau programmeur en java et sur ce forum. je sollicite votre aide pour un problème que je n'arrive pas à résoudre. j'ai un dossier contenant 10 CV tous au format word, que j'ai converti en texte. j'ai ensuite créé un fichier texte dans lequel j'ai ajouter les CV les uns à la suite des autres. maintenant à partir de ce seul fichier texte, j'aimerai pour chaque CV extraire la fonction et la date d'ajout du CV dans le dossier (si c'est possible), et l'enregistrer dans un fichier sous cette forme :
    Fonction commercial
    date 20-01-1998

    Fonction chercheur au CNRS
    date 01-05-2000

    Fonction informaticien développeur
    date 01-05-2000

    ...

    j'ai pu écrire un programme qui lit le fichier ligne à ligne.

    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
    public static void LoadFile(String file){
    		 boolean ok = true;
     
    		try{
                 // Création du flux bufférision sur un FileReader, immédiatement suivi par un
                 // try/finally, ce qui permet de ne fermer le flux que si le reader
                 // est correctement instancié (évite les NullPointerException)
                 BufferedReader buff = new BufferedReader(new FileReader(file));
     
                 try {
                      String line;
                      // Lecture du fichier ligne par ligne. Cette boucle se termine
                      // quand la méthode retourne la valeur null.
                       while ((line = buff.readLine()) != null && ok) {
                    	   if(line.contains(" ") && !line.contains("Page")){
                    		   if(!line.contains("Dossier de compétences")){
                   				 ok = parserLine(line);
                    		   }
                    	   }
     
     
                       }
     
                       PrintWriter ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
               	    ecrivain.println(text);
                 } finally {
                      // dans tous les cas, on ferme nos flux
                      buff.close();
                 }
             } catch (IOException ioe) {
                      // erreur de fermeture des flux
                      System.out.println("Erreur --" + ioe.toString());
             }
    	}
     
    	private static boolean parserLine(String line){
     
    		if(!line.contains("Prénom")){
    			text += line+" ";
    			System.out.println(text);
    			return true;
     
    		}if(!line.contains("Expérience") && !line.contains("Prénom")){
    			System.out.println(text);
    			return true;
    		}else{
    			return false;
    		}
     
    	}
    voici un exemple de mon fichier texte à lire :

    Dossier de compétences





    Consultant Data Scientist
    Développeur JAVA


    Prénom : ALEX
    Expérience*: 2 ans
    Date de disponibilité : Immédiate

    CDT/DC/BVI/FOR/V1
    Page 1 sur 4


    Dossier de compétences – BVI/2014
    Page 2 sur 4




    Dossier de compétences





    TITRE / FONCTION


    Prénom : Kounan
    Expérience*: 1 an 3mois
    Date de disponibilité : dans un mois
    Si vous pouvez m'aider ce sera avec grand plaisir

  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,

    Pour extraire des données particulières d'un texte il faut soit des marqueurs distincts et de préférence simples à repérer, soit une IA extrêmement complexe. Déjà pourquoi regrouper les fichiers en un, alors que distinguer les CV est plus simple avec plusieurs fichiers ; ou alors, il faudrait au moins des marqueurs qui permettent de distinguer les cv entre eux. Cela peut être simplement une ligne avec des -, ou un mot spécial dont tu es sûr qu'on ne la trouvera jamais dans un cv. Ensuite, pour les données, il faut aussi des marqueurs. Si pour le prénom, la ligne commence par Prénom :, alors effectivement on pourra extraire le prénom. Mais comment extraire la fonction dans ton fichier ? Qu'est-ce qui permet de savoir que dans telle ligne, on a la fonction ? Au vu de ton code, j'ai l'impression que le principe ce serait au contraire d'exclure les lignes qui contiendrait des données identifiées comme le prénom ou l'expérience. On peut procéder effectivement de cette manière si le format du fichier s'y prète (si tout ce qui est à exclure est identifiable simplement et sans ambiguïté).

    Mais quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(!line.contains("Prénom")){
    			text += line+" ";
    			System.out.println(text);
    			return true;
     
    		}if(!line.contains("Expérience") && !line.contains("Prénom")){
    			System.out.println(text);
    			return true;
    		}else{
    			return false;
    		}
    Tu dis si la ligne ne contient pas Prénom, alors je l'ajouter au texte, que j'affiche, je dis ok=true, et je ne fais pas la suite. Si la ligne ne contient pas "Experience" et ne contient pas "Prénom" j'affiche le texte déjà obtenu et je dis ok=true.
    Soit :
    1. si la ligne ne contient pas "Prénom" (peu importe qu'il contienne "Expérience" ou pas), le premier test est vrai, on sort de la méthode avec true.
    2. si la ligne contient "Prénom" (peu importe qu'il contienne "Expérience" ou pas), alors le second test est faux, on sort de la méthode avec false.
    3. si la ligne ne contient que "Experience", pas "Prénom", alors le premier test est faux, et le second aussi.

    Inutile de tester "Experience" donc.


    Si tu veux faire ce genre de chose (prendre toutes les lignes sauf certaines qui correspondent à un cas identifiable (qui contient ça, qui commence par ça, etc...), il faut mieux :
    1. soit procéder par exclusions successives :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      if ( line.contains( "truc" ) ) {
            return false; // j'exclus
      } else if ( line.contains( "machin" ) ) {
            return false; // j'exclus
      }
      /**...**/
      else {
           return true; // je n'ai rien exclus, donc j'inclus
      }
    2. Soit par combinaison de ou :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      return !( line.contains("truc") || line.contains("machin"));

    Tu mets ça dans une méthode (par exemple boolean inclureLigne(String line) et tu appelles if ( inclureLigne(line) ) { text+=line }.

    Au passage, ce n'est pas très important dans le cadre de ton exercice, mais normalement, il faut éviter ces concaténations successives, qui sont gourmandes en mémoire et temps, en les remplaçant pas un StringBuilder.
    StringBuilder text =new StringBuilder();, le code ci-avant devenant : if ( inclureLigne(line) ) { text.append(line); }.
    Mais comme tu utilises un PrintWriter à la fin, tu peux même plutôt utiliser directement ce PrintWriter :
    if ( inclureLigne(line) ) { ecrivain.print(line) }.

    A noter aussi, que avec text += line+" ";, tu vas te retrouver avec qu'une seule ligne dans le fichier à la fin. Il faudrait introduire des sauts de ligne : text += line + System.lineSeparator(); ou avec le StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     text.append(line);
     text.append(System.lineSeparator());
    et avec le PrintWriter c'est encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ecrivain.println( line );
    Enfin, tu fermes ton flux d'entrée et c'est très bien. Mais tu ne fermes pas ton flux de sortie, ce qui est bien plus important : tu risques que d'une part il ne soit pas complet (le tampon du BufferedWriter ne soit pas vidé) et que le fichier soit verrouilé pour un usage ultérieur. Le plus simple pour ce genre de chose étant d'utiliser un try-with-ressources qui t'évitera d'avoir à imbriquer des try/finally avec des appels de close(), et de manquer de bien fermer en cas d'exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try(BufferedReader buff = new BufferedReader(new FileReader(file);
    PrintWriter ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
    )) {
           // boucle de lecture ici
    } catch(IOException e) {
       // traitement de l'exception ici
    }
    Tu peux même simplifer ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try(
          PrintWriter ecrivain =  new PrintWriter(Files.newBufferedWriter(Paths.get("test.txt")))
    ) {
           // boucle de lecture :
         for(String line : Files.readAllLines( Paths.get(file) ) ) {
              if ( inclureLigne(line) ) {
                   ecrivain.println( line );
              }
         }
    } catch(IOException e) {
       // traitement de l'exception ici
    }
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci joel.drigo pour ta réponse.
    En fait la fonction est identifiable entre Dossier de compétence et Prénoms.

    selon ce que j'ai fait j'obtiens effectivement un seule ligne avec l'ensemble des données des différents CV.
    j'obtiens ça :

    Consultant Data Scientist Développeur JAVA Date de disponibilité : Immédiate ... Commercial avant vente Date de disponibilité : immédiate ... Chercheur CNRS Date de disponibilité : ...

    Ce fichier je peux facilement le traiter. Si je choisi comme séparateur Date de disponibilité, j'en aurai autant que de CV présent dans le fichier.
    Est-il possible d'avoir la date d'ajout d'un fichier dans un répertoire avec Java ?

  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
    Citation Envoyé par koukounou Voir le message
    Merci joel.drigo pour ta réponse.
    En fait la fonction est identifiable entre Dossier de compétence et Prénoms.
    Tu veux dire qu'il s'agit des lignes entre la ligne "Dossier de compétence" et celle qui contient "Prénom" ?

    Ce fichier je peux facilement le traiter. Si je choisi comme séparateur Date de disponibilité, j'en aurai autant que de CV présent dans le fichier.
    Mouais, autant utiliser un séparateur de ligne, c'est plus commun qu'une phrase...

    Est-il possible d'avoir la date d'ajout d'un fichier dans un répertoire avec Java ?
    Sur les systèmes qui le supportent, oui, enfin plus précisément la date de création du fichier (sinon ce sera la date de dernière modification)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static LocalDateTime getCreateDate(String filepath) throws IOException { 
    		BasicFileAttributes attr = Files.readAttributes(Paths.get(filepath), BasicFileAttributes.class);
    		return LocalDateTime.ofInstant(attr.creationTime().toInstant(), ZoneId.systemDefault());
    	}
    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.

Discussions similaires

  1. Extraire des blocs de données dans un fichier. AWK?
    Par oliverjack dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2009, 19h56
  2. Extraction de données d'un fichier texte
    Par boobz dans le forum Langage
    Réponses: 1
    Dernier message: 30/03/2008, 11h40
  3. Réponses: 4
    Dernier message: 05/02/2008, 11h08
  4. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  5. Perl: Extraction de données d'un fichier texte ?
    Par fifto dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 16h01

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