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 :

remplacer une chaine ds un fichier rapidement !


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut remplacer une chaine ds un fichier rapidement !
    Bonjour à tous,

    je cherche une fonction qui me permet de remplacer une chaine dans fichier texte SANS lire ligne par ligne ... car cette méthode est très lente si le fichier est gros

    je voudrais que ça soit aussi rapide que Ctrl-R Ctrl-S

    merci d'avance !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    On pourrait voir le code entier...


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    euuh en fait je devais pas mettre le code source
    le code que j'ai mis est juste pour montrer que la méthode est tros lente.

    je cherche en fait tout simplement une fonction qui permet de remplacer une chaine de caractère dans un fichier text

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quickReplaceStringOnFile();
    Moi non plus je ne met pas le code ce serait trop facile...

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    ???
    je n'ai pas mis le code car je pense que ça n'aidera pas ... mais bon le voici :

    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
     
    	public static void removeAlertMsg(File f) {
     
    		String chaine = "";
    		String varName = null;
     
    		// lecture du fichier texte
    		try {
    			InputStream ips = new FileInputStream(f);
    			InputStreamReader ipsr = new InputStreamReader(ips);
    			BufferedReader br = new BufferedReader(ipsr);
    			String ligne;
    			while ((ligne = br.readLine()) != null) {
    				if (ligne.contains(ALERT_MSG)) {
    					int start = ligne.indexOf(ALERT_MSG);
    					varName = "$intern_" + ligne.substring(start - 20, start - 4).trim().split("\\$intern\\_")[1];
    					System.out.println(varName);
    					System.out.println(varName);
    				}
     
    				if (varName != null && ligne.contains(".alert(" + varName)) {
     
    				}
    				System.out.println(ligne);
    				chaine += ligne + "\n";
    			}
    			br.close();
    		} catch (Exception e) {
    			System.out.println(e.toString());
    		}
     
    		// création ou ajout dans le fichier texte
    		try {
    			FileWriter fw = new FileWriter(f);
    			BufferedWriter bw = new BufferedWriter(fw);
    			PrintWriter fichierSortie = new PrintWriter(bw);
    			fichierSortie.println(chaine + "\n test de lecture et écriture !!");
    			fichierSortie.close();
    			System.out.println("Le fichier " + f + " a été créé!");
    		} catch (Exception e) {
    			System.out.println(e.toString());
    		}
    	}

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par need2learn Voir le message
    ???
    je n'ai pas mis le code car je pense que ça n'aidera pas ...
    En même temps si je le demande c'est qu'il y a une raison

    Mes remarques :
    • Comme je m'en doutais, ce n'est pas le readLine() qui est problématique (il est de toute manière bufférisé), mais bel et bien ton code : tu utilises l'opérateur + pour la concaténation de String, ce qui est catastrophique dans une boucle.
      Pour générer des String il faut utiliser StringBuilder (voir StringBuffer si on a besoin de synchronisation).
    • Il manque les try/finally pour fermer les flux (ah si je pouvais recevoir 1€ à chaque fois que je dit cela ).
    • Ton code n'effectue aucun remplacement...
    • La partie effectuant l'écriture devrait être conditionné. C'est inutile lorsqu'il n'y a aucun remplacement.
    • La gestion des exceptions n'est pas terrible
    • "\n" n'est pas portable. Utilise System.getProperty("line.separator") à la place...
    • Si tu as de gros fichiers, il pourrait peut-être être intérressant d'ouvrir un autre fichier en écriture en même temps, et d'y écrire directement les données afin d'éviter de générer une grosse variable en mémoire...



    a++

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par need2learn Voir le message
    Bonjour à tous,

    je cherche une fonction qui me permet de remplacer une chaine dans fichier texte SANS lire ligne par ligne ... car cette méthode est très lente si le fichier est gros
    Je pense pas que l'aspect ligne par ligne impacte énormément les performances. Et la conversion binaire -> texte est inévitable dans ton cas. Quand à lire tout le fichier... Je vois pas comment tu imagine qu'on puisse recherche un texte dans un fichier sans le lire complètement.

    Dans ton code, ceci
    impacte fortement les performance. Si ton fichier fait, disons, 15M en mémoire cette ligne va faire ceci vers la fin de fichier

    • création d'un nouveau Stringbuffer avec la string (15M de mémoire allouée)
    • Agrandissement du StringBuffer pour effectuer le 'add' (de nouveau 15M d'alloué, transférés et les 15 précédent libéré ensuite
    • Conversion du Stringbuffer en String (de nouveau 15M alloué)
    • Abandon du StringBuffer(15M libéré)

    Et ça, a chaque boucle. Tu devrais plutot écrire chaque ligne au fur et à mesure dans le fichier de destination en faisant ton filtrage.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    parfait ! ça marche en même pas une seconde

    merci adiGuba & tchize_

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

Discussions similaires

  1. Chercher et remplacer une chaine dans un fichier texte C
    Par étoile de mer dans le forum Débuter
    Réponses: 6
    Dernier message: 14/11/2011, 12h59
  2. Remplacer une chaîne de caractères dans un fichier .hex
    Par subsix dans le forum Assembleur
    Réponses: 8
    Dernier message: 23/11/2006, 22h06
  3. Réponses: 4
    Dernier message: 18/07/2006, 17h31
  4. Réponses: 10
    Dernier message: 16/06/2006, 14h53
  5. Réponses: 7
    Dernier message: 27/09/2005, 12h54

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