Sauvegarder efficacement des modifications à un document texte

Aaliibaba Messages postés 4 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 18 février 2008 - 6 févr. 2008 à 16:02
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 - 7 févr. 2008 à 11:41
Bonjour,


 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>



Je suis sur un programme de traitement par lot (batch) qui consiste à ouvrir un fichier texte, à chercher certains mots (donnés par un tableau en mémoire), à les remplacer par l’équivalent (toujours dans le tableau, colonne 2) puis à sauvegarder le fichier texte et passer au suivant.







C’est là que se situe mon problème : j’ai cherché et trouvé plusieurs manières de chercher/remplacer du texte (voir plus bas) mais je n’ai pas de bonne solution pour sauver les modifications dans le fichier texte.





.





J’ai tenté de faire une séparation en 3, fichiertexte.Write texteavant & motremplacé & texteaprès mais ça ne marche bien que pour une seule ligne.





 





J’ai encore essayé de lire la ligne, fermer le fichier, ouvrir le fichier de nouveau et écrire la ligne modifiée mais je n’arrive toujours à remplacer qu’une seule ligne. Et il me manque un indicateur de position efficace car c’est toujours la première ligne du fichier texte qui est remplacée…





 





Quelle méthode préconisez-vous pour remplacer un mot dans un texte de plusieurs lignes et sauvegarder le tout ensuite ?





N’y a-t-il que des méthodes ligne par ligne, en utilisant un indicateur de position ?





 





Trouver, récupérer position, prend le tout avant, le tout après, fermer, ouvrir, coller le tout avant, le mot remplacé et le tout après, pour chaque modification ?





 





A propos de chercher/remplacer du texte, quelle est la méthode la plus efficace ? Un fichiertexte.ReadAll, un accès ligne par ligne fichiertexte.ReadLine avec Boucle For…Next ou un tableau basé sur une fonction tableautexte = split(fichieràlire, «  « ) ?





Il faut savoir que chaque fichier texte contient environ 3x180 mots et qu’il y en a 6'000 à vérifier, une fonction adéquate est donc bienvenue.





 





Merci d’avance à tous ceux qui me liront et me donneront un conseil très bienvenu.




Aalii

5 réponses

capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
6 févr. 2008 à 16:23
J'ai deja fait qqch dans le genre :
Ouverture d'un fichier, lecture ligne par ligne et je referme le fichier (il est automatiquement enregistré)

Lors de la lecture, j'utilise la méthode 'Replace' du format Chaine de caracteres, qui est tres pratique et assez rapide.
Pour ma part, je pense que le traitement de chaines de caracteres est le truc le plus long et générant le plus d'erreur qui soit....

Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Aaliibaba Messages postés 4 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 18 février 2008
6 févr. 2008 à 16:43
Merci Capuccino,

Ca m'a l'air exceptionnellement simple si je peux juste refermer le fichier pour enregistrer, ça me tente beaucoup ;-)

Mais je testerai ça sera ce soir chez moi, je donnerai mon résultat à ce moment là.

J'ai aussi vu la fonction replace dans une source, si tu dis que c'est pas mal, je vais l'utiliser.

Merci encore pour la rapidité de ta réponse et bonne fin de journée !

P.S: Si tu as fait qqch dans le genre, aurais-tu publié la source sur ce site ?
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
6 févr. 2008 à 17:05
Si dans un fichier, toute les occurences d'un mot doivent être remplacées par le même autre mot, tu peux :
1- Ouvrir le fichier source en lecture
2- Charger son contenu dans un buffer mémoire
3- Fermer le fichier source
4- utiliser la fonciton Replace() sur le buffer
5- Supprimer le fichier source et le recréer en l'ouvrant en écriture
6- Ecrire le buffer dedans
7- Refermer ce fichier

Peros, je ferais tout de même comme ca (à partir du point 5)
5- Créer un fichier temporaire en l'ouvrant en écriture
6- Ecrire le buffer dedans
7- Refermer le fichier temporaire
8- Supprimer le fichier source
9- Renommer le fichier temporaire en fichier source

C'est un peu plus long mais plus sécurisé ! A voir

Sauf pour le remplacement des mots dans le buffer ou il va falloir boucler sur un tableau, c'ets presque une ligne de code par point, donc très simple
0
Aaliibaba Messages postés 4 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 18 février 2008
6 févr. 2008 à 23:21
Bonsoir,

Je commence à m'approcher du succès, encore 2-3 petits détails à régler mais la procédure suggérée par Kristof, notamment par le buffer, me permet de contourner le problème du ligne par ligne (dans mon petit fichier test en tout cas, à voir dans le vrai qui est plus grand).

Pour être sûr de ne rien effacer par erreur, je copie directement le fichier source dans un dossier temporaire et travaille sur ce dernier. Quand tout est prêt, je copie en remplaçant dans le dossier d'origine.

Ce qui est assez sympa avec le texte dans le buffer, c'est que je le parcours avec toute ma liste de mots à vérifier, dès qu'il y a un changement à faire, je le fais et le buffer devient le nouveau texte à parcourir:
KorrTabelle est un tableau (1 To 2, n Mots) chargé au préalable avec toute la liste des mots à rechercher (col.1, dim 1) et l'équivalent à remplacer (col.1, dim 2)

strSourceString = TempTextDatei.ReadAll
            For EndeListe = 1 To UBound(KorrTabelle, 2)
               
                'Laden wir das 1. Wort das zu suchen ist
                strFindString = KorrTabelle(1, EndeListe)
               
                'Haben wir ein Wort zu ersetzen ?
                If InStr(strSourceString, strFindString, vbTextCompare) > 0 Then '0 = Nichts
                 
                    'Wenn ja, dann ist der Buffer den ganzen Text
                    'der strFindString wird durch das korrektes ersetzt
                    strBuffer = Replace(strSourceString, strFindString, KorrTabelle(2, EndeListe), , , vbTextCompare)
                   
                    strSourceString = strBuffer 'Der neue Text wird jetzt durchgesucht
                End If
            Next EndeListe

Sauf que ma fonction InStr ne marche pas encore pour l'instant mais la structure y est.
Merci tout le monde et bonne fin de soirée !

Aalii
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
7 févr. 2008 à 11:41
Pourquoi faire un test avec Instr() ?

strBuffer = Replace(strSourceString, KorrTabelle(1, EndeListe) KorrTabelle(2, EndeListe), , , vbTextCompare)

Avec ca à la palce du bloc If ... End If ca devrait le faire.
0
Rejoignez-nous