Rechercher une sous chaine dans un fichier texte en java

Signaler
-
 Elkader -
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

Messages postés
14492
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 juillet 2020
420
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
Merci je vais voir
Messages postés
15934
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 juillet 2020
94
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.
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.
Messages postés
15934
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 juillet 2020
94 > elkader
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
>
Messages postés
15934
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 juillet 2020

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 ?
Messages postés
15934
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 juillet 2020
94 > elkader
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();
    }
}
>
Messages postés
15934
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 juillet 2020

Tres grand merci pour votre code