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

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

Langage Java Discussion :

Condition while non satisfaisante


Sujet :

Langage Java

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Points : 154
    Points
    154
    Par défaut Condition while non satisfaisante
    Bonjour,

    J'aimerais extraire d'un fichier texte, un nombre de lignes.

    J'ai une méthode qui me permet de trouver ma ligne de début en fonction d'une chaine de caractères et d'une ligne pour comparer pour commencer (dans le cas de la première ligne de début pour trouver ma première chaine, cette ligne est égale à 1), mais pour trouver ma ligne de fin, je mets la ligne de comparaison égale à la ligne de fin.
    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
    package import_donnees;
     
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    //Pour l'appel de cette classe, indiquer dans un premier temps, la chaine à rechercher puis la ligne de départ
     
    public class recherche{
     
        public static int main(String chaine, int ligne_comp) {
     
            String line = null, recherche = chaine, path = "temp.txt";
            // le chemin du fichier et le mot recherche doivent etre definis
            try
              {
              BufferedReader br = new BufferedReader
                (new FileReader(path));
            int i = 1; //initialisation du numero de ligne
            while (((line = br.readLine()) != null) )//j'ai essayé en modifiant la condition comme ceci while (((line = br.readLine()) != null) &&i<=ligne_comp )
              {
                        // je pensais mettre ici, un truc qui viens ecrire dans un fichier txt toutes les lignes à partir de ligne de comp qui correspond à ma ligne de début( quand celle-ci est différente de 1 jusqu'à la ligne où se situe le caractère)
                if ( line.indexOf(recherche) != -1)
                 {
     
                    System.out.println("Mot trouve a la ligne " + i );
                    return(i);
              }
                i++;
              }
            br.close();
     
              }
            catch(FileNotFoundException exc) 
            { 
                System.out.println("File not found" );  
            }
     
            catch(IOException ioe) 
            { 
                System.out.println("Erreur IO" ); 
            }
            return 0;
        }
    }
    A partir de ce code je pensais que toutes les lignes qui contiennent la chaine qui déterminera ma ligne de fin qui se situe avant ma ligne de début, ne seraient pas prises en compte, mais ce n'est pas le cas.

    Quelqu'un saurait-il m'indiquer pourquoi ?

    Merci d'avance pour 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,

    Si je comprends bien tu voudrais extraire un certain nombres de lignes d'un fichier, à partir de la ligne qui contient une certaine chaîne de caractères et jusqu'à la ligne qui contient cette même chaine de fin. Déjà, l'algorithme viendra plus facilement si tu utilises des noms de variables qui ont un sens, et des variables suffisantes pour représenter tous les concepts nécessaires pour l'élaboration de l'algorithme.

    Bon je ne comprends pas très bien quel résultat tu voudrais que ta méthode retourne : si c'est le numéro de la première ligne trouvé, c'est ce que fait ta méthode (à part une petite erreur sur le close() dont je parle après, il n'y a pas de problème dans ta méthode. Il serait plus logique de retourner le nombre de lignes lues, ou la liste des lignes lues. On va partir sur cette dernière idée, parce qu'elle permet aussi de connaitre le nombre de lignes lues (c'est le nombre de lignes dans la liste).

    On a besoin,

    1. De paramètres en entrée :
      • nom de fichier (variable String path)
      • chaine à rechercher (variable String recherche)
    2. De paramètres en sortie :
      • liste de lignes lues (List<String> lignesLues)
      • Le numéro de la première ligne lue, puisque c'est le retour d'appel de la méthode d'après ton code (variable int premiereLigne
    3. De variables de travail :
      • Le fait qu'on ait trouvé la chaine à chercher, pour commencer à stocker les lignes extraites (variable boolean debutTrouve)
      • Le fait qu'on ait trouvé la chaine à chercher, pour arrêter l'extraction (variable boolean finTrouve)
      • Le nombre de lignes lues, pour connaitre le numéro de la première ligne qui contient la chaine recherchée



    Ensuite, 2 ou 3 choses :

    On doit toujours fermer un flux, ou un reader, après l'avoir lu. Dans ton code, quand tu fais return(i);, tu quittes la méthode sans appeler close() puisque cette ligne se trouve après. Lorsqu'il y a une exception, on va directement aux catch et donc close n'est pas exécuté non plus. Pour fermer à coup sûr, soit tu mets l'appel à close() dans un block finally, soit tu utilises la structure try-with-resource (voir dans mon exemple).

    Ensuite, sur les exceptions, il vaut mieux afficher la stackTrace, qu'un message abrégé. C'est le cas pour l'IOException : en cas d'erreur, tu auras bien plus d'informations pour comprendre ce qui ne va pas avec la stackTrace, qu'avec un simple message "Erreur IO". Dans le cas du FileNotFoundException, on comprend que le fichier n'a pas été trouvé donc le message "File Not Found" pourrait être suffisant : cependant, en cas d'erreur dans le path, il te faudra peut être chercher plus longtemps pourquoi le fichier que tu crois lire, et qui est bien là, n'est pas trouvé, alors avec la stackTrace, tu pourras peut être voir que le path n'est pas celui que tu pensais.

    J'ajouterai qu'une bonne indentation aide aussi grandement la compréhension d'un code.

    Donc, en l'état, le code remis en forme serait, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public class Recherche{
     
    	/**
             * @param path chemin du fichier
             * @param lignesLues une liste qui permet de récupérer les lignes lues
             * @param recherche chaine à rechercher
             * @return numéro de la première ligne qui contient la chaine cherchée, ou 0 si la chaine n'a pas été trouvé
             */
        public static int recherche(String path, List<String> lignesLues, String recherche) {
     
        	int premiereLigne=-1; // valeur résultat à retourner à l'appelant, si on trouve la seconde ligne qui contient la chaine à rechercher
     
        	boolean debutTrouve=false; // permet de détermine qu'on a trouvé la première ligne contenant la chaine à rechercher, 
        	boolean finTrouve=false; // permet de détermine qu'on a trouvé la seconde ligne contenant la chaine à rechercher, donc la dernière ligne à extraire
     
            try ( BufferedReader br = new BufferedReader(new FileReader(path)) ) { // on ouvre le fichier (et on le ferme automatiquement à la fin du try - ici structure try-with-resource)
    	        int nbLignesLues=0; // permet de compter les lignes lues
    	        String line; // permet de lire chaque ligne
    	        while (((line = br.readLine()) != null) && !finTrouve ) { // tant qu'on lit des lignes, et qu'on a pas trouver la fin
    	            nbLignesLues++; // on compte la ligne qu'on lit dans cette itération
    	            if ( line.indexOf(recherche) != -1) { // si la ligne contient la chaine à rechecher...
    	            	if ( debutTrouve ) { // si on a déjà trouvé la chaine à chercher, alors on est à la fin
    	            		finTrouve = true; // on note qu'on a trouvé la fin
    		            }
    	            	else {
    			            debutTrouve = true; // alors on note qu'on a trouvé la chaine, et qu'on est au début de la liste de lignes à extraires
    			            premiereLigne=nbLignesLues; // on en profite pour stocker le numéro de la première ligne
    	            	}
    	            }
    	            else if ( debutTrouve ) {
    	            	// sinon et si on a trouvé la chaine à rechercher, on stocke la ligne lue
    	            	lignesLues.add(line);
    	            }
    	          }
            } catch(FileNotFoundException e) { 
                e.printStackTrace();
            } catch(IOException ioe) { 
                ioe.printStackTrace(); 
            }
            if ( finTrouve  ) { // si on a trouvé ce qu'on cherchait 
            	return premiereLigne; // on retourne le numéro de la ligne qui contenait ce qu'on cherchait
            }
            else {
            	return 0; // on retourne 0 si on trouve pas la chaine cherchée
            }
        }
     
        public static void main(String[] args) {
     
        	// exemple d'appel
     
        	List<String> lignes = new ArrayList<>();
     
        	int ligneLue = recherche("temp.txt", lignes, "chaine");
     
        	if ( ligneLue>0 ) {
        		System.out.printf("La chaine a été trouvée en %d et en %d%n", ligneLue, ligneLue + lignes.size() + 1);
        		System.out.println("Et voici les lignes entre les deux lignes qui contiennent la chaine recherchée : ");
        		int noLigne = ligneLue+1;
        		for(String ligne : lignes) {
        			System.out.printf("[%d] %s%n", noLigne, ligne);
        			noLigne++;
        		}
        	}
        	else {
        		System.out.println("Chaine non trouvée");
        	}
     
     
        }
     
    }
    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é
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Points : 154
    Points
    154
    Par défaut
    Merci pour les conseils, ça m'a permis de revoir un peu ce que j'avais fait pour l'instant, les commentaires ont été utiles pour bien appréhender mon problème

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

Discussions similaires

  1. condition sur while non prise en compte
    Par Thierry2008 dans le forum Débuter
    Réponses: 4
    Dernier message: 24/04/2009, 18h24
  2. [MySQL] Condition champ non rempli
    Par gaspard27 dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 27/08/2008, 01h01
  3. declaration forward ou external non satisfaisante
    Par sp2308 dans le forum Débuter
    Réponses: 2
    Dernier message: 09/01/2008, 15h51
  4. Condition OR non prise en compte
    Par Thetonio007 dans le forum SQL
    Réponses: 7
    Dernier message: 08/06/2007, 16h02
  5. Condition macro non respectée
    Par pascal913 dans le forum Access
    Réponses: 12
    Dernier message: 04/07/2006, 12h49

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