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;
}
A voir également:
Rechercher une sous chaine dans un fichier texte en java
Whismeril
Messages postés18622Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention28 septembre 2023629 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
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126 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.
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.
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126
>
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
elkader
>
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 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 ?
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126
>
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();
}
}
Elkader
>
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023 4 mars 2020 à 14:22
3 mars 2020 à 23:31