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 :

Lecture d'un fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Lecture d'un fichier texte
    Bonjour,

    J'aurai besoin un peu d'aide la lecture d'une fichier texte.

    J'ai par exemple dans mon fichier texte ceci : chien(terrier, caniche, bergerallemand, labrador, cocker) et je voudrais pouvoir associer terrier = 0, caniche=1, bergerallemand=2, labrador=3, cocker=4 sachant que le nombre de races peut varier selon ce que l'utilisateur indique dans le fichier texte.

    J'arrive à lire le document ligne par ligne pour l'instant. J'ai lu des informations sur les tables de hachage où une valeur est associée à une clé, est ce que c'est ça que je dois utiliser pour ce que je veux faire ?

    Merci beaucoup de votre aide!

  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,

    Premièrement, il faut que tu découpes les lignes lues afin d'obtenir les mots séparés. Ce qui implique en premier lieu que tu aies bien une forme constante de chaîne.

    Si on part du principe que tu as bien un <mot> suivi d'une liste de <mot>, séparés par des virgules, entre parenthèses, cette découpe va te donner un structure composé donc d'un mot et d'une liste de mots associés, donc par exemple chien associé à la liste des mots terrier, caniche, bergerallemand, labrador, cocker. Si les numéros a associer aux mots de ta liste correspondent bien à l'ordre dans cette liste, tu obtiendras bien ce que tu cherches à avoir directement.

    Comment procède-t-on pour découper une chaîne en mots, selon une syntaxe particulière ? Il y a 2 moyens principaux pour des cas aussi simples : utiliser ce qu'on appelle les expressions régulières ou découper la chaîne à l'aide de différentes méthodes de la classe String. Les expressions régulières sont un moyen très puissant, mais aussi relativement complexe lorsqu'on ne les connait pas. L'alternative de découper la chaîne avec les méthodes de la classe String demandera de taper plus de code, mais aura l'avantage d'être plus facilement compréhensilble.

    Par exemple, les méthodes qui vont te servir sont les suivantes :

    • String.indexOf(char) : cette méthode permet de connaitre l'emplacement d'un caractère donné (par exemple, si ta ligne lue dans le fichier est dans la variable line int index = line.indexOf('(');, mettra la position de la parenthèse ouvrante dans la variable index ;
    • String.substring(debut, fin) : cette méthode permet de créer une nouvelle chaîne à partir d'une autre, en donnant la position du premier caractère, et la position du caractère qui suit le dernier caractère (donc fin exclu) de la sous-chaine (par exemple, String espece = line.substring(0, index);, avec index obtenu dans l'appel juste avant te permet d'extraire le nom de l'espèce, chien dans ton exemple (il s'agit bien de la partie de la chaîne qui se trouve entre le premier caractère de la chaîne (position 0) et la parenthèse ouvrante, exclue ;
    • String.split(expression) : cette méthode permet de découper une chaîne en plusieurs morceaux, en utilisant une expression régulière. Lorsqu'on doit découper une liste avec un séparateur simple comme la virgule, l'expression régulière est très simple, puisqu'il s'agit de ". Par exemple, String[] tableau = "a,b,c".split(","); va te donner un tableau qui contient successivement a, b puis c.


    Déjà, à partir de ça, tu peux déjà commencer à élaborer comment tu vas découper tes lignes lues dans ton fichier. Je te laisse essayer.

    En ce qui concerne, les tables de hashage, il n'est pas impossible que tu en aies besoin à un moment, mais ni pour la découpe de la ligne, ni pour déterminer l'ordre des éléments découpés. Elles pourraient te servir par exemple, pour compter les occurences de race qui se répètent de lignes en lignes, mais c'est une autre histoire. Déjà commence par découper tes lignes, on verra pour la suite : si tu n'arrives pas à aller plus loin, revient présenter le code que tu as fait et poser les questions nécessaires.
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Salut salut,
    Merci de m'avoir aidé !
    J'ai un autre problème maintenant En effet, le fichier que je lis sur java contient:
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chien(...,...) 
    chat(...,...)
    oiseau(...,...), 
    etc
    J'ai une boucle sur i qui permet de lire ligne par ligne et une boucle sur j (à l'intérieur de i) qui sépare les sous catégories et puis je veux retourner la longueur de la première sous catégorie de chien (terrier dans cas). Ça marche quand je mets le programme dans la classe main mais je veux le mettre sous forme de méthode et seulement appeler la méthode dans le main.

    Mon problème est dans le return. Mon code est sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int methode (){
    try {
    for sur i
    for sur j}
     
    {catch
    }
     
    }
    Je pensais mettre le return après le catch mais ca ne marche pas, eclipse me demande de créer une variable locale sachant que cette variable est déjà crée dans la boucle j.

    Merci de votre aide

  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
    C'est un peu difficile pour moi d'y voir clair. Avec un code un peu plus complet peut-être. De ce que je comprends tu as quelque chose sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int method() {
       for(int i=0; i<nbi; i++) {
     
          for(int j=0; j<nbj; j++ ) {
     
              int x = <je ne sais pas quoi>;
     
          }
     
       }
       return x; // ici tu ne peux pas faire ça parce que x est déclaré dans le bloc du for j, donc inaccessible en dehors
    }
    Maintenant, cela dépend un peu de la déclaration de x, et de son calcul (est-ce une condition qui détermine qu'on créé x, x est-il un cumul, etc...)

    Un moyen général de résoudre le cas est de déclarer x dans le bloc de la méthode, de manière à ce qu'il soit accessible dans la ligne où il y a le return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public int method() {
       int x=-1; // on a besoin d'initialiser cette variable, avec une valeur qu'on doit pouvoir interpréter éventuellement comme distinct de tout autre résultat pour savoir qu'on ne l'a pas obtenue dans le for
       for(int i=0; i<nbi; i++) {
     
          for(int j=0; j<nbj; j++ ) {
     
              x = <je ne sais pas quoi>;
     
          }
     
       }
       return x; // ici x est bien accessible
    }
    2 exemples de 2 cas possibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public int method(int[][] array) {
       int x=0;
       for(int i=0; i<array.length; i++) {
     
          for(int j=0; j<array[i].length; j++ ) {
     
              x += array[i][j]; // on fait un cumul
     
          }
     
       }
       return x; // x vaut la somme de toutes les valeurs du tableau
    }
    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
    public int method(int[][] array) {
       int x=-1;
       for(int i=0; x==-1 && i<array.length; i++) { // on ne boucle plus dès qu'on a trouvé un x>=0
     
          for(int j=0; x==-1 && j<array[i].length; j++ ) { // on ne boucle plus dès qu'on a trouvé un x>=0
     
              if ( array[i][j]%2==0 ) { // test si la valeur est paire
                 x=j;
              }
     
          }
     
       }
       return x; // x vaut le numéro de colonne de la première valeur paire, ou -1 si on a pas trouvé de valeur paire
    }
    qui peut s'écrire aussi :

    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
    public int method(int[][] array) {
     
       for(int i=0; i<array.length; i++) { 
     
          for(int j=0; j<array[i].length; j++ ) { 
     
              if ( array[i][j]%2==0 ) { // test si la valeur est paire
                 return j; // on a trouvé alors on retourne le numéro de colonne, ce qui a pour effet de sortir (prématurément) de la méthode
              }
     
          }
     
       }
       return -1; // on a rien trouvé alors on retourne -1
    }
    A noter, que le try { ] catch( ) définit lui aussi un bloc, et donc la variable doit être déclarer en dehors de ce bloc, ou retournée dans le bloc try, avec un return <valeur particulière> dans le catch
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup, il fallait juste initialiser la variable avant la boucle

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'aurais une autre question : maintenant j'ai crée une méthode qui retourne une hashmap et dans cette méthode il y a une boucle qui permet d'ajouter des éléments cette hashmap. Et quand j'essaye d'utiliser la hashmap dans une autre classe (après avoir importé la classe où la méthode est déclarée), eclipse me demande de déclarer ma hashmap localement ...
    Est ce que je dois aussi initialiser la hashmap ? Sa taille étant variable, je ne peux pas le faire manuellement avant la boucle!

    Merci de votre aide

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'ai résolu le problème, il fallait que je crée un nouvel objet pour pouvoir utiliser la méthode. La taille doit être variable parce que ça dépend de l'utilisateur.

Discussions similaires

  1. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 15h04
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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