Rechercher une sous chaine dans un fichier texte en java

elkader - Modifié le 3 mars 2020 à 19:37
 Elkader - 4 mars 2020 à 14:22
Bonjour,
je suis entrain de progrmmer une fonction qui permet de trouver le nombre d'occurence d'une chaine de carectere dans un fichier texte

tout est juste , mais le probleme c'est si cette chaine que je veux la trouver se devise en deux partie , l'une dans la premiere ligne et le reste se trouve dans ligne suivante

par exemple :
la chaine a rechercher : je suis un etudiant
le texte de recherche :
je suis bouhlel abes j'ai 29 ans je suis
un etudiant a l'universite ..............

dans cet exemple mon code java ne peux pas detecter la chaine je suis un etudiant

le code

public  int countStringInFile(String stringToLookFor, String fileName){
        int count = 0;
        int countFirst=0;
        int countLast=0;
        stringToLookFor=" "+stringToLookFor+" ";
        String stringToLookForFirst=stringToLookFor+"";
        String stringToLookForLast=""+stringToLookFor;
        String line=concat(fileName);
            int startIndex = line.indexOf(stringToLookFor);
            int startIndexFirst=line.indexOf(stringToLookForFirst);
            int startIndexLast=line.indexOf(stringToLookForLast);
            if(startIndexFirst != -1){countFirst++;}
            if(startIndexLast != -1){countLast++;}
            while (startIndex != -1) {
              count++;
              startIndex = line.indexOf(stringToLookFor, 
              startIndex +stringToLookFor.length());
            }
        return count+countFirst+countLast;
      }

2 réponses

Whismeril Messages postés 18622 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 septembre 2023 629
3 mars 2020 à 21:25
Bonsoir

Je ne code pas en java, mais les regex ont un très bon temps de capture.
Et tu peux t’affranchir des sauts de ligne avec l’option quo permet de les ignorer.
https://www.qwant.com/?q=regex+en+java&t=web
1
Merci je vais voir
0
KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126
3 mars 2020 à 19:42
Bonjour,

Dans ta méthode "concat" qui lit le fichier, tu peux enlever les sauts de ligne, ce qui ferait que ton fichier ne serait qu'une seule ligne de texte pour ton traitement.
0
Merci pour votre reponse ;
mais j'ai dejat teste mon code sur un texte qui ne contient aucun saut de ligne
j'ai essaye de mettre tout le texte dans une variable String , mais cette solution est n'est pas utile voir dans un grande fichier texte par exemple de taille 10 mg.
0
KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126 > elkader
3 mars 2020 à 20:06
Si ton code fonctionne sur un texte qui ne contient aucun saut de ligne, il fonctionnera aussi si tu enlèves tous les sauts de lignes d'un texte qui en contient.

Remarque :
  • cela ne pose aucun problème de mettre un fichier entier dans un String (jusqu'à 2Go)
  • si tu commences à te poser des questions de performance sur ton programme alors il faut revoir tout le code
0
elkader > KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023
3 mars 2020 à 20:19
Merci
oui si tu peux m'aides j'ai besion de solutions mielleure qe ca
en vue le temps d'execution par exemple
j'ai teste mon code sur un fichier de 1,4 mg il prend 1s , est il bon ?
0
KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023 126 > elkader
4 mars 2020 à 12:59
Bonjour,

On ne doit pas mesurer un fichier par son temps d'exécution, cela dépend de trop de paramètres liés à la machine.
Éventuellement on pourrait comparer deux programmes sur la même machine, mais pas sur des temps aussi courts.

Un exemple complet, qui utilise le principe que je proposais précédemment : supprimer les sauts de lignes.

import java.io.*;
import java.nio.file.*;

public class Text {
    public static int countStringInFile(String string, String fileName) {
        String sanitizeFile = sanitizeString(readFile(fileName));
        String sanitizeString = sanitizeString(string);
        for (int startIndex = 0, result = 0;; startIndex++, result++) {
            startIndex = sanitizeFile.indexOf(sanitizeString, startIndex);
            if (startIndex == -1) {
                return result;
            }
        }
    }

    private static String readFile(String fileName) {
        try {
            return new String(Files.readAllBytes(Paths.get(fileName)));
        } catch (IOException e) {
            throw new UncheckedIOException("Can't readFile: " + fileName, e);
        }
    }

    private static String sanitizeString(String string) {
        return string.replaceAll("\\s+", " ").toLowerCase();
    }
}
0
Elkader > KX Messages postés 16722 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 septembre 2023
4 mars 2020 à 14:22
Tres grand merci pour votre code
0
Rejoignez-nous