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

Java Discussion :

Problème de recherche dans fichier texte


Sujet :

Java

  1. #1
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut Problème de recherche dans fichier texte
    Bonjour,

    J'ai un prog qui doit chercher ce que l'utilisateur tappe, dans 2 fichiers texte.
    Et suivant s'il trouve une correspondance, effectue une certaine action.

    J'ai fais quelques if qui renvoie ensuite à un switch / case (je n'arrive pas à organiser cela comme il faut, je ne sais pas comment m'y prendre).

    Un soucis, c'est la recherche. Ce que l'utilisateur tappe est passé en majuscule, avec suppression des espaces.

    Dans les fichiers, le texte est en majuscule également.
    Mais il ne trouve la recherche que s'il n'y a que le mot en question, dans une phrase, il ne le trouve pas. Est-ce normal ?

    path, c'est le fichier txt.
    line, un string qui contient la ligne en cours de lecture.
    reponse, le texte de l'utilisateur, en majuscule et sans espace.
    rech renvoie au switch / case

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Scanner scanner = new Scanner(new File(path));
                while (scanner.hasNextLine()) {
                    line = scanner.nextLine();
                    if (line.toUpperCase().contains(reponse)) {  
                        rech = 3; 
                    }
                }
                scanner.close();
    Voila, si vous pouviez me renseigne svp,
    Merci d'avance,
    Très cordialement,

    ANDRE Ani

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    le scanner place le texte de chaque ligne dans line.
    Il ne supprime pas les espaces.

    L'utilisateur tape un texte avec espaces. Ce texte est placé dans reponse et les espaces sont supprimés.

    Donc quand reponse (sans espace) est cherché dans line (avec espace), on ne peut pas le trouver.

    => pourquoi supprimer les espaces de reponse ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Oui, bien sur que scanner ne supprime pas les espaces, c'est moi qui les supprime, je pensais que se serait plus simple pour faire des recherches.

    Mais, que j'enlève ou non les espaces, ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String bot = jTextArea1.getText().toUpperCase();
    Scanner scanner = new Scanner(new File(path));
                while (scanner.hasNextLine()) {
                    line = scanner.nextLine(); 
                    if (line.toUpperCase().contains(recherche)) { 
                        rech = 3; 
                    }
                }
                scanner.close();
    Mais je commence à me demander si cela est faisable. On tappe une phrase, et il faut rechercher dans un fichier plusieurs mots clés qui pourraient être présent dans cette phrase.

  4. #4
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Bon, j'essaye de réorganiser mon code différemment, mais ça ne fonctionne pas comme il faut.
    Il m'affiche presque toujours l'avant dernière ligne du fichier "connaissance.txt", je ne comprends pas pourquoi...

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    try {  
                String nom = System.getProperty("user.name");
                String line = null;
                String path = "memoire.txt";
     
                String line2 = null;
                String path2 = "connaissances.txt";
     
                String base = null;
                String user = jTextArea1.getText();
                String prompt = nom + " : " + user;
                String histo = jEditorPane1.getText();
     
     
                jEditorPane1.setContentType("text/html");
                jEditorPane1.setEditable(false);
                String bot = jTextArea1.getText().toUpperCase();        
     
                HTMLEditorKit kit = new HTMLEditorKit();
                HTMLDocument doc = new HTMLDocument();
                jEditorPane1.setEditorKit(kit);
                jEditorPane1.setDocument(doc); 
     
     
                int rech = 0;
     
     
                int rep = bot.length();
     
                Scanner scanner = new Scanner(new File(path2));
                while (scanner.hasNextLine()) {
                    line2 = scanner.nextLine();
                    if (bot.contains(line2)) {
                        base = scanner.nextLine(); 
                        rech = 4; 
                    }
     
                    else if (line2.contains(" DATE ")) {
                        rech = 1;
                    }
     
                    else if (line2.contains(" HEURE ")) {
                        rech = 2;
                    }
     
                    else if (rep < 2) {
                    rech = 5;   
                    }
     
                    else {
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), "Je ne comprends pas<br>", 0, 0, null);
                        jTextArea1.setText("");
     
                    }
     
                }
                scanner.close(); 
     
    switch (rech) {
     
                    // date
                    case 1: 
                        Date time = new Date();
                        DateFormat dfl = DateFormat.getDateInstance(DateFormat.FULL);
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), "Prof Tux : Nous sommes le " + dfl.format(time) + "<br>", 0, 0, null);
                        jTextArea1.setText("");
                        break;
     
                    case 2:
                        Date date = new Date();
                        SimpleDateFormat dateFormatComp;
                        dateFormatComp = new SimpleDateFormat("dd MMM yyyy hh:mm:ss a");
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt  + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), "Prof Tux : " + dateFormatComp.format(date), 0, 0, null);    
                        jTextArea1.setText("");
                        break;     
     
                    // en mémoire
                    case 3:
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), "Prof Tux : On en a déja parlé il me semble" + "<br>", 0, 0, null);
                        jTextArea1.setText("");
                        break;
     
                    // base    
                    case 4:
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), base + "<br>", 0, 0, null);
                        jTextArea1.setText("");
                        break;
     
                    // réponse vide    
                    case 5:
                        kit.insertHTML(doc, doc.getLength(), histo + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), prompt  + "<br>", 0, 0, null);
                        kit.insertHTML(doc, doc.getLength(), "Prof Tux : Vous n'avez rien à dire" + "<br>", 0, 0, null);
                        jTextArea1.setText("");
                        break;
                    }
    Et en faisant comme cela, il ne cherche que dans un fichier, alors que j'aimerais qu'il puisse le faire dans deux.

    Je suis un peu perdu...

  5. #5
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Bonjour,

    J'ai modifié le code. Toujours le même principe, on lit le fichier, il y a des if else qui renvoient à un switch case.

    Le soucis, c'est qu'il ne semble lire que la première ligne du fichier...

    Voici le 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
     
    scanner = new Scanner(new File(path2));
                while (scanner.hasNextLine()) {
                    line2 = scanner.nextLine();
                    JOptionPane.showMessageDialog(null, "bot : " + bot + "   line2 : " + line2); 
                    if (bot.contains(line2)) {
                        rech = 4;
                    } 
     
                    else if (bot.contains(" DATE ")) {
                        rech = 1;
                        break;
                    }
     
                    else if (bot.contains(" HEURE ")) {
                        rech = 2;
                        break;
                    }
     
                    else if (rep < 2) {
                        rech = 5; 
                        break;
                    }
     
                    else {
                        rech = 6;
                        break;
                    }
                }
                scanner.close();
    Si quelqu'un voit mon erreur svp ?
    Merci d'avance,

    Très cordialement,

    ANDRE Ani

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    c'est probablement le break qui te fait sortir de ta boucle de lecture. Si la première condition testée est fausse, toutes les autres, en particulier le dernier else, font sortir de la boucle.
    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
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Sinon pour réaliser ta recherche,

    1) tu devrais diviser le texte tapé en mots par String[] mots=bot.split(" ");2) tu parcours le premier fichier, tu testes si chaque mot lu fait partie d'un des mots du tableau mots[]
    3) si tu n'a rien trouvé, tu fais la même chose sur le second fichier.
    4) mets ton switch après les deux lectures, et traite les cas "je ne comprends pas" à la fin dans le switch
    5) tu peux simplifier la compréhension globale de ton code en utilisant une enum plutôt qu'un int pour déterminer ce qui a été trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public enum TYPE_MOT_TROUVE {
        DATE, HEURE, MOTDANSFICHIER1, MOTDANSFICHIER2, RIEN;
    }
    Donc en gros :

    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
    String[] mots=bot.split(" ");
    TYPE_MOT_TROUVE rech=TYPE_MOT_TROUVE.RIEN; 
    String mottrouve=null;
    String line;
    Scanner scanner1=...
    while (rech==TYPE_MOT_TROUVE.RIEN && scanner1.hasNextLine() ) {
                    line = scanner1.nextLine();
            for(String mot : mots){
                if ( mot.equalsIgnoreCase(line) ) {
                     mottrouve=mot;
                     rech=TYPE_MOT_TROUVE.MOTDANSFICHIER1;
                     break;
                }
            }
    }
    scanner1.close();
            if ( rech==TYPE_MOT_TROUVE.RIEN ) {
    Scanner scanner2=...
    while (rech==TYPE_MOT_TROUVE.RIEN && scanner2.hasNextLine() ) {
                    line = scanner2.nextLine();
            for(String mot : mots){
                if ( mot.equalsIgnoreCase(line) ) {
                     mottrouve=mot;
                     rech=TYPE_MOT_TROUVE.MOTDANSFICHIER2;
                     break;
                }
            }
    }
    scanner2.close();
    }
     
            if ( rech==TYPE_MOT_TROUVE.RIEN ) {
                for(String mot : mots){
                   if ( "DATE".equalsIgnoreCase(mot) ) {
                      rech=TYPE_MOT_TROUVE.DATE;
                      break;
                  }
                   else if ( "HEURE".equalsIgnoreCase(mot) ) {
                      rech=TYPE_MOT_TROUVE.HEURE;
                      break;
                  }
                }
            }
     
    switch(rech) {
        case DATE:
            ...
            break;
        case HEURE:
            ...
            break;
        case MOTDANSFICHIER1:
            ...
            break;
        case MOTDANSFICHIER2:
            ...
            break;
        default:
            // cas "je ne comprends pas"
     
    }

    Ensuite, comme ton programme est en mode interactif, avec un jtextarea, c'est que probablement l'utilisateur va taper plusieurs phrases, donc tu peux avoir intérêt à charger tes fichiers en mémoire une fois pour toute (à moins qu'il s'agisse d'énormes fichiers) plutôt que de les lire à chaque fois.

    Si tu charges les mots de chaque fichier dans un Set<String> set, tu peux tester la présence d'un mot par un set.contains(mot).
    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.

  8. #8
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Merci beaucoup pour tous ces conseils !

    J'ai enlevé les breaks des if else, mais la recherche ne fonctionne tjs pas.

    Pour la comparaison, j'avais essayé de découper la chaine (tokens, tableau de string), mais après, je n'arrive plus à faire de contains. (ce n'est pas equals dont j'ai besoin, je dois tester si, dans la phrase tappée par l'utilisateur, certains mots sont dans un des fichiers).

    Il faut que j'essaye Set<string> set, effectivement se serait surement mieux. Il faut que je vois comment ça marche. Mais un des fichiers se rempli au fur et à mesure de l'utilisation du programme donc pas possible pour celui la.

    En fait, tout ça, c'est pour essayer de faire un ptit bot simple.
    Un fichier pour la base de connaissances, un pour la mémoire, quelques if else pour effectuer des opérations (donner l'heure, ouvrir le navigateur...).

    Encore merci pour l'aide ;-)

  9. #9
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lostsoul Voir le message
    Pour la comparaison, j'avais essayé de découper la chaine (tokens, tableau de string), mais après, je n'arrive plus à faire de contains.
    Je ne vois pas pourquoi tu ne pourrais plus faire de contains(), mais vu que ça ne servirait plus à rien...
    Citation Envoyé par lostsoul Voir le message
    (ce n'est pas equals dont j'ai besoin, je dois tester si, dans la phrase tappée par l'utilisateur, certains mots sont dans un des fichiers).
    Si tu as une phrase :
    "Heureux qui, comme Ulysse, a fait un beau voyage,"

    Et que tu le découpe en mot (évidement avec une espace seulement ça va pas suffire, à cause de la ponctuation (c'est peut être que ça ton problème).
    Mais admettons qu'on la coupe en mot :
    ça donne
    "Heureux", "qui", "comme", Ulysse", "a", "fait", "un", "beau", "voyage"

    et que tu as dans ton fichier :
    HEUREUX
    VOYAGE

    un equalsIgnoreCase() va obligatoirement fonctionner pour détecter les mots "Heureux" et "voyage".

    Accessoirement, pour faire le split avec la ponctuation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] mots = phrase.split("[ ,;:!?.]+");
    Ou une version plus complète de la regexp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[ .!?,;:\"()\\[\\]*§+/]+"
    ou tu peux ajouter la quote si tu veux (parce qui la ça considère que "l'arbre" par exemple, c'est un seul mot) .

    Attention, les caractères typographiques (espaces fines par exemple, ou autre apostrophe, ne sont pas gérés 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.

  10. #10
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    D'accord, je vais tester cela alors. Encore merci beaucoup ;-)

  11. #11
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Bonjour,

    J'ai testé avec votre exemple de code, mais je ne comprends pas pourquoi, il trouve certains mots dans le fichier, mais pas tous en fait, et je ne comprends pas pourquoi.

    Voila le 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
    58
    59
    60
    61
    62
    63
    64
     
    String[] mots = bot.split("[ ,;:!?.]+");
                TYPE_MOT_TROUVE rech = TYPE_MOT_TROUVE.RIEN;
                String mottrouve = null;
                String line;
     
                scanner1 = new Scanner(new File(path));
                while (rech == TYPE_MOT_TROUVE.RIEN && scanner1.hasNextLine()) {
                    line = scanner1.nextLine();
                    for (String mot : mots) {
                        if (mot.equalsIgnoreCase(line)) {
                            mottrouve = mot;
                            rech = TYPE_MOT_TROUVE.MOTDANSFICHIER1;
                            break;
                        }
                    }
                }
                scanner1.close();
     
                if (rech == TYPE_MOT_TROUVE.RIEN) {
                    scanner2 = new Scanner(new File(path2));
                    while (rech == TYPE_MOT_TROUVE.RIEN && scanner2.hasNextLine()) {
                        line = scanner2.nextLine();
                        for (String mot : mots) {
                            if (mot.equalsIgnoreCase(line)) {
                                mottrouve = mot;
                                rech = TYPE_MOT_TROUVE.MOTDANSFICHIER2;
                                break;
                            }
                        }
                    }
     
                }
     
                if (rech == TYPE_MOT_TROUVE.RIEN) {
                    for (String mot : mots) {
                        if ("DATE".equalsIgnoreCase(mot)) {
                            rech = TYPE_MOT_TROUVE.DATE;
                            break;
                        } else if ("HEURE".equalsIgnoreCase(mot)) {
                            rech = TYPE_MOT_TROUVE.HEURE;
                            break;
                        }
                    }
                }
     
    switch(rech) {
        case DATE: ...
                        break;
        case HEURE: ...
     
                        break; 
     
        case MOTDANSFICHIER1: ...
                        break;
        case MOTDANSFICHIER2: ...
                        base = scanner2.nextLine(); 
                        ...
                        scanner2.close();
                        break;
        default: ...
                        break;
     
    }
    J'ai déplacé la fermeture de scanner2 sinon il ne pouvait afficher la réponse.
    Je ne met plus le texte entré en majuscule, et il est également en minuscule dans le fichier.

    Et effectivement, avec les enum, c'est plus clair.

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il y a un problème avec ta façon de fermer scanner2 : si le mot n'est pas dans fichier2, il n'est pas fermé ! Si tu as besoin de lire quelque chose dans le fichier 2 à la suite du mot trouvé, fait le dans la boucle de lecture de fichier 2, dans le bloc du if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (mot.equalsIgnoreCase(line)) {
                                mottrouve = mot;
                                rech = TYPE_MOT_TROUVE.MOTDANSFICHIER2;
                                 infoSuppl = lireInfoSupplFichier2(scanner2, mottrouve);
                                break;
                            }
    Ne fais pas de traitement complet, fais juste un chargement des lignes nécessaires du fichier, et, éventuellement, un prétraitement s'il s'agit de données structurées.

    Pour ce qui est des mots qui ne sont pas trouvé; il faudrait que j'ai des exemples, sinon je ne peux pas deviner ce qui ne va pas. Peut être est-ce un problème d'espaces, par exemple, auquel cas le code suivant pourrait corriger le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mot.equalsIgnoreCase(line.trim())) {
    Sinon, tu n'as bien qu'un seul mot pas ligne ?

    Enfin, puisque tes "sources" de mots sont des fichiers, fait plutôt des structures de try pour les lires, sinon en cas d'erreur, les fichiers ne seront pas fermés. Par exemple, pour le fichier 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    try(Scanner scanner1 = new Scanner(new File(path))){
     
    while (rech == TYPE_MOT_TROUVE.RIEN && scanner1.hasNextLine()) {
                    line = scanner1.nextLine();
                    for (String mot : mots) {
                        if (mot.equalsIgnoreCase(line)) {
                            mottrouve = mot;
                            rech = TYPE_MOT_TROUVE.MOTDANSFICHIER1;
                            break;
                        }
                    }
                }
    }
    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
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Je pense à une chose. Visiblement ton fichier2 a une structure du type :

    mot
    base
    mot
    base
    mot
    base
    ...
    Peut-être devrais-tu intégrer cette notion dans ta boucle de lecture du fichier2, pour éviter de tester base comme mot...

    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
    if (rech == TYPE_MOT_TROUVE.RIEN) {
     
       try(Scanner  scanner2 = new Scanner(new File(path2))) {
                    while (rech == TYPE_MOT_TROUVE.RIEN && scanner2.hasNextLine()) {
                        line = scanner2.nextLine();
                        String base;
                        if ( scanner2.hasNextLine())) {
                           base=scanner2.nextLine();
                        }
                        else {
                           base=null;
                        }
                        for (String mot : mots) {
                            if (mot.equalsIgnoreCase(line)) {
                                mottrouve = mot;
                                rech = TYPE_MOT_TROUVE.MOTDANSFICHIER2;
                                infoSuppl=lireInfoSuppl(base, mottrouve);
                                break;
                            }
                        }
                    }
      }
    }
    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.

  14. #14
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Merci bien pour ça ;-)

    Oui, le fichier2 est bien comme cela :

    un ou des mots clés
    la réponse à afficher

    un ou des mots clés
    la réponse à afficher

    ...

    Et dans le fichier1, j'ajoute au fur et à mesure les phrases entrées par l'utilisateur pour vérifier qu'il ne dit pas plusieurs fois la même chose (c'est une "mémoire" en quelque sorte).

    Donc, je dois d'abord chercher dans fichier1 s'il trouve une correspondance. Si oui, le prog réponds quelque chose.

    Si non, il cherche dans fichier2 s'il trouve une correspondance, puis réponds avec la bonne ligne de fichier2.

    S'il ne trouve rien, il regarde dans les autres if / else (comme DATE ou HEURE, j'en ajouterais d'autres ensuite).

    Je vais regarder attentivement tous tes exemples, et aussi essayer de comprendre pourquoi il ne trouve pas toujours les mots.

    Merci pour tout ;-)

  15. #15
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lostsoul Voir le message
    Donc, je dois d'abord chercher dans fichier1 s'il trouve une correspondance. Si oui, le prog réponds quelque chose
    Du coup, c'est pas aussi simple que de chercher si un des mots est déjà dans le fichier par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mot.equalsIgnoreCase(line)) {
    Ca ne fonctionne pas si la phrase a déjà été mise exactement pareille : il faudrait faire une première passe pour tester si la phrase entière n'est dans le fichier, par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try(Scanner scanner1 = new Scanner(new File(path))){
     
    while (rech == TYPE_MOT_TROUVE.RIEN && scanner1.hasNextLine()) {
                    line = scanner1.nextLine();
                    for (String mot : mots) {
                        if (bot.equalsIgnoreCase(line)) {
                            // pharese identique (à la casse près) déjà rencontrée...
                            break;
                        }
                    }
                }
    }
    Ensuite le même mot peut apparaître dans 2 phrases qui n'ont strictement aucun rapport, ou, qui même si elles ont rapport, ne pose pas de problème à être répétées.

    Par exemple, tout simplement : je peux demander l'heure 2 fois avec un laps de temps important entre les deux, et la réponse est différente la plupart du temps dans les 2 cas.

    Pour le cas général, c'est vachement plus sioux ! C'est un vaste sujet...

    Pour commencer, il te faut déjà, à mon avis, gérer des listes de stopwords (des mots à ignorer dans les comparaisons, comme les articles, les pronoms, les conjonctions, bien que les conjonctions peuvent avoir leur importance pour différencier le sens aussi...)...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Oui, je me suis lancé sur un projet qui est bien compliqué pour mon faible niveau ;-)
    J'essaye de créer un ptit bot, c'est un domaine qui m'intéresse vraiment.
    Je test Program-ab (Java et AIML et Program-O, PHP/MYSQL et AIML).

    Et donc, j'essaye aussi de voir si j'arrive à faire un ptit truc pas trop mauvais, mais c'est pas gagné ;-)

  17. #17
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Tu peux regarder du coté de l'antique ELIZA pour tes premiers pas dans le domaine. Je me souviens avoir saisi le code, y'a un bail, à partir d'un listing trouvé dans une revue. Ce n'était pas très compliqué, rigolo au début, mais vite limité. Mais peut être suffisant pour ce que tu veux faire.
    Je ne suis pas un expert du domaine, mais je crois qu'il y a eu des évolutions du principe ensuite que tu dois pouvoir trouver sur le net.
    Et puis il y a des choses comme ALICE, beaucoup plus évoluées. Avec des API java qui peuvent peut être t'aider...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Oui, la j'ai testé Program-AB, en Java, mais y a un pbm pour faire une applet avec...
    Et je regarde du côté de Program-O, en PHP/MYSQL qui semble prometteur ;-)

Discussions similaires

  1. [Batch] Recherche dans fichier texte
    Par julien41 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 11/07/2012, 12h12
  2. [PowerShell] recherche dans fichier texte
    Par noahline dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/02/2011, 12h51
  3. [Débutant] problème de puissance dans fichier texte
    Par pompier21 dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/11/2009, 12h07
  4. Recherche dans fichier texte
    Par billyzkick dans le forum VB.NET
    Réponses: 3
    Dernier message: 20/07/2009, 16h04
  5. Problèmes Ecriture dans Fichiers Texte
    Par JmL40 dans le forum Langage
    Réponses: 13
    Dernier message: 26/09/2007, 14h04

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