Modifier fichier texte

maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010 - 14 août 2007 à 17:39
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011 - 16 août 2007 à 16:29
Bonjour,
J'aimerais savoir comment faire pour faire une petite gymnastique avec un fichier txt je vous explique ; j'ai un fichier (config.txt) qui contient comme son nom l'indique des lignes de texte (une ligne par config) pour la configuration d'une application. J'aimerais savoir faire en sorte que mon application detecte dans le fichier config.txt la ligne suivante ("AutoExec, 1,0 - 2 false#") et si il detecte cette ligne l'application vb devra modifier cette ligne par en l'occurence ("AutoExec, 1,0 - 2 true#")

j'espère avoir été assez claire,
Merci d'avance

123

40 réponses

cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
14 août 2007 à 21:35
Ah ben remplace "loren est" par "wxcvb", sinon c'est normal que ça ne t'enlève pas la chaîne, puisqu'elle n'y est pas^^.


Tu comprends la syntaxe? Tu dois juste adapter la chaîne en fonction de ce que tu cherches.

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
14 août 2007 à 23:33
PArdonde vous déranger, mais just eune petite remarque ...
Question perf, on préfèrera lire tout le fichier depuis le disque d'un coup, puis travailler sur son contenu en mémoire, plutot que de fair eune lecture ligne par ligne.
Un truc du genre :

Dim L() As String
Dim i As Long,FN As Long


FN = Freefile()
Open "Config.txt" For input As #FN
L = Split(Input(Lof(FN), #FN), vbCrLf)
Close #FN
For i = 0 to UBound(L)
' Traitement de la ligne L(i)
Next

Pour réécrire le fichier, on fera pareil, tout d'un coup :

FN = FreeFile()
Open "Config.txt.tmp" For Output As #FN
Print #FN, Join(L, vbCrLf)
Close #FN
If LenB(Dir$("Config.txt"))<>0 Then Kill "Config.txt"
Name "Config.txt.tmp" As "Config.txt"
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
15 août 2007 à 00:11
Je pense justement que c'est plus lourd en mémoire... De plus, si ton fichier est trop gros, tu risque de ne pas avoir l'intégralité de ton fichier...
Mais sinon ce code est bien aussi. Tu l'as trouvé où? Tu l'as bien assimilé?

Si en plus ça marche, c'est parfait, tu as ce que tu voulais!

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
15 août 2007 à 00:22
Tu l'as trouvé ou ? Ben dans ma tête!
Plus lourd en mémoire !? Comprends pas, en tout cas, 10 fois plus rapide surement ! EN PARTICULIER si elficheir est volumineux ! De la à faire swapper Widows ! Surtout qu'il s'agit d'un fichier de config, il ne doit pas peser 50Go, non ?
0

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

Posez votre question
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
15 août 2007 à 00:26
Bah le prend pas mal^^!
Pour le volume du fichier ça dépend, y'en a de plusieurs mégaoctets^^.
Et sinon, ta boucle ne sert à rien si tu fais Join après

Bonne soirée!

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
15 août 2007 à 02:28
Je me permet d'apporter une autre manière de faire.
je place un controle richtextbox sur ma feuille

'je dimensionne mes variables
Dim A as Long
Dim B as Long

'je charge le fichier de config
Richtextbox1.Loadfile "C:\Config.txt",1

'Je recherche le texte à remplacer
A = Richtextbox1.find(chr(10) &"AutoExec, 1,0 - 2 true#" ,1)

'Si la recherche a été concluente,
If A>-1 then ' **
    'Je cherche la fin de la ligne
    B = Richtextbox1.find(chr(13),A)
                                              ' le chr(13) qui correspond au saut de ligne
                                             ' je lance la recherche à partir de la ligne A

        If B= -1 then
            Richtextbox1.Selstart=A
            Richtextbox1.Sellengh=10000000
            B=Richtextbox1.Selstart + Richtextbox1.sellengh
            '(équivaut à  B=len(Richtextbox1.text) en + rapide )
        End if

End if  ' **

Richtextbox1.Selstart =A+1

Richtextbox1.Sellengh= B-A-1

Richtextbox1.SelText="Texte de remplacement de la ligne

'j' enregistre le tout quand c'est terminéle fichier de config
Richtextbox1.Loadfile "C:\Config.txt",1

'++++++++++++++++++++++++++++++++

'Remarque:
'L'intérêt de cet exemple est le suivant:
'Je peux chercher simplement

A = Richtextbox1.find(chr(10) &"AutoExec")

'Mon petit prog te sélectionne la ligne complète et tu peux remplacer par la valeur de ton
'choix sans connaître le texte d'origine (AutoExec, 1,0 - 2 true#" ,1)
0
maxsecurite2 Messages postés 181 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 9 avril 2010
15 août 2007 à 14:49
bonjour,
je viens d'essayer la méthode du [auteurdetail.aspx?ID=916487 Papa de Thibaut]
et malheuresement sa ne fonctionne pas je m'explique le code trouve bien la partie à modifier et modifie bien celle ci par contre il faut d'abord suprimmer entièrement la ligne ou se trouve la partie à modifier en l'occurence si il trouve AutoExec, 1,0 - 2 true# il doit dégager entièrement cette ligne et remplacer par (par exemple) "ici ligne nouvelle"

quelqu'un sait comment regler le problème ?

123
0
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
15 août 2007 à 15:28
Peux-tu t'expliquer davantage
car si le prog TROUVE et REMPLACE ton texte, qu'est ce qui ne marche pas?
Que signifie "dégager" une ligne
Autre point, si tu supprimes une ligne, elle n'existe plus (!)

Richtextbox1.Selstart=A+1
Richtextbox1.Sellengh=B-A+1 ' et non plus Richtextbox1.Sellengh=B-A-1 comme avant
(je sélectionne le texte + les 2 caractères chr(13) et chr(10) correspondant au saut de ligne)

Richtextbox1.SelText=""
La ligne a été supprimée. Maintenant, on ne peut effectivement plus la remplacer puisqu'elle n'existe plus. Il s'agit dorénavant d'un problème d'ordre métaphysique et non plus un problème de prog.

Si tu désires insérer une ligne supp dans le fichier, il suffit de taper
Richtextbox1.Selstart=0
Richtextbox1.Sellengh=0
Richtextbox1.Seltext="Nouvelle Ligne" + Chr(13) + Chr(10)

Problème résolu?
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
15 août 2007 à 16:00
Un peu plus tortueux^^. Mais de toute façon chacun voit la méthode qui lui plaît le plus .


J'ai l'impression que c'est plus long de cette manière...

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
15 août 2007 à 16:05
Le Papa de Thibaut (de la part du papa de Mathias et Josselin) < Utiliser un contrôle sur une form pour travailler sur un fichier est, à mon avis, une mauvaise idée : empreinte mémoire lourde, lent et avec un code pas forcément plus court.
Mais cela n'est que mon avis et n'engage que moi.

Sharkiller < Je ne suis pas vexé et je n'ai aucune boucle superflue dans le code que j'ai proposé à Maxsecurite2. Je redonne içi le code ...

Dim L() As String
Dim i As Long,FN As Long

FN = Freefile()
Open "Config.txt" For input As #FN
L = Split(Input(Lof(FN), #FN), vbCrLf)
Close #FN
For i = 0 to UBound(L)
' Traitement de la ligne L(i)
Next

Pour réécrire le fichier, on fera pareil, tout d'un coup :

FN = FreeFile()
Open "Config.txt.tmp" For Output As #FN
Print #FN, Join(L, vbCrLf)
Close #FN
Kill "Config.txt"
Name "Config.txt.tmp" As "Config.txt"

Il n'y a qu'à y ajouter le code de traitement des lignes dans la boucle.
j'ai juste supprimé le test d'existance du fichier pour la suppression. Comme on vient de lire celui-ci, il exist forcément.
Par contre, il faudra ajouter en tout début de code ce test, au pire des cas un gestionnaire d'errreur pour le Open "Config.txt" For input as #1 mais perso, je préfère un bon test àun gestionnaire d'erreur lent et encombrant
0
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
15 août 2007 à 16:18
Juste 2 questions:

Quelle méthode nécessite le moins de ressources système ?
Laquelle est la plus rapide d'exécution ?

Quant à la méthode que je propose, c'était juste histoire de proposer "autre chose". Je ne connais pas ses limites et elle me semblait rapide. Serais-ce mieux de faire une lecture ligne par ligne? On gagne en mémoire (1 ligne au lieu d'un texte) mais chaque ligne doit être traitée, ce qui n'est pas le cas d'un texte.

J'aimerai beaucoup avoir une réponse. Cela m'intéresse d'autant plus que je relis souvent mes progs pour y grapiller des milisecondes...
merci.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
15 août 2007 à 16:54
Les éléments les plus lents dans un PC, ce sont les mémoires de masse : Les disques durs et CD sont donc à considérer comme lent (je ne parle même pas des disquettes ou d'un lien réseau).
Et il sera toujours plus efficace de lire 1 fois 10 kilo-octets que 10 fois 1 kilo-octet ! C'ets la loi des temps incompressibles qui s'applique : un ordre d e lecture/écriture prend un peu de temps à être déclenché, et quelque soit la quantité de données lues/écrites, ce temps est le même ! Autant en faire le moins possible.
Après il faut pondérer cela avec la taille du fichier à traiter bien sur ,mais nos PC sont dotés de 512 voir 1024 Mo de RAM (qui est de plus en plus rapide, contrairement aux HDD qui stagnent en vitesse ces derniers temps), donc un fichier de quelques centaines de kilo-octets, passera sans souci : Si le fichier fleurte avec les Méga-octets, il faut sérieusement se poser des questions, et alors pourquoi ne pas utiliser une solution intermédiaire en lisant les données par paquet de 512 kilo-octet, gérable en mémoire, et s'épargner du ligne à ligne !
De toute façon, il faut bien se dire que le pire ennemi du codeur (particulièrement avec un langage comme VB6, qui a tendance à ne pas être très véloce) c'est la boucle ! moins tu as de tour de boucle, plus ton code sera rapide. En fait, si tu places dans une boucle For i =1 to 10000 une instruction qui te coute 1 millième de seconde (négligeable en soit !), et bien tu perd 10 secondes en sortie de boucle, et 10s, c'est monstrueux !
Et la différence entre un traitement ligne par ligne d'un fichier texte en tableau mémoire ou en lecture sur HDD pourrait bien se compter en plusieurs millième de seconde par ligne ! Encore plus si tu utilises un controle RTF

Controle sur une form programmation objet programmation lente et surcharge mémoire inutile !

A titre perso, lorsque j'ai compris cela, j'ai repris mes principaux programmes qui exploitaient des fichiers disques conséquent et sur certains traitement, j'ai gagné des centaines de secondes, plusieurs minutes donc !
Une comptable qui met 3 secondes à faire ses virements à la banque au lieu de 3 minutes, elle te saute au coup et t'invite à boire un verre ... ce qui peut être très tentant (selon la comptable, bien sur !! Certaines "vilaines" ont toujours la vieille version !!)

Donc, pour conclure, sur un fichier de config,qui ne dépassera sans doute pas les 3 ou 4 kilo-octets, c'est négligeable, je suis bien d'accord.
Mais autant prendre de bonnes habitudes, et au moins en être conscient.
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
15 août 2007 à 17:37
D'accord, merci pour les conseils!
Au passage, je n'ai pas dis que ton code était mauvais Kristof_Koder. Par contre, comme je le disais la boucle après la lecture ne sert à rien :-\. Enfin bon j'imagine que c'était juste pour montrer les différentes possibilités.

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
15 août 2007 à 17:49
Bien sur que la boucle sert ... Si tu lis un fichier c'est bien pour en exploiter les lignes, non ?
Donc il te faut bien une boucle sur les items de ton tableaux, ou alors on lit un fichier juste pour le plaisir, et la, moi, je code zéro ligne pour le plaisir
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
15 août 2007 à 17:51
Oui c'est sûr... Mais t'y mets quoi dans la boucle? Ca alourdit pas?

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
15 août 2007 à 18:41
Merci beaucoup [auteurdetail.aspx?ID= 1121413 ]Kristof_Koder, [auteurdetail.aspx?ID =1121413 je crois que je vais étudier davantage la question. Je compte toutefois optimiser mes progs pour traiter des fichiers lourds car quand je traite 6 à 7000 fichiers de grosse taille, ça peut prendre plusieurs minutes.]
    Quelle méthode utiliser pour traiter de gros fichiers? Comment remplacer le richtext sans le contrôle?
merci

ps désolé pour le soulignement, il est "bloqué"
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
16 août 2007 à 08:42
Le Papa de Thibaut < Comme je l'ai dit plus haut, pour le traitement de gros fichier, on pourra les traiter par petit paquet de quelques centaines de kilo-octet.
Sharkiller < On y met quoi dans la boucle ?
Et bien ce qu'il faut faire sur chaque ligne. Il me semble qu'a la base, le problème était de remplacer une ligne commencant par "AutoExec, 1,0 - 2 false#" par "AutoExec, 1,0 - 2 true#".
On mettra donc un truc du genre ...

Dim L() As String
Dim i As Long,FN As Long

FN = Freefile()
Open "Config.txt" For input As #FN
L = Split(Input(Lof(FN), #FN), vbCrLf)
Close #FN
For i = 0 to UBound(L)
if L(i) Like "AutoExec, 1,0 - 2 false#*" Then
L(i) = "AutoExec, 1,0 - 2 true#"
Exit for ' Ceci uniquement s'il n'y a assurément qu'une seule ligne de ce genre
End if
Next

ET ca devrait être bon comme ca
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
16 août 2007 à 15:33
Oki doki^^.
En même temps c'est pas pour moi tout cela .


Et la différence entre like et =?

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
16 août 2007 à 15:46
donne une correspondance exacte alors qu'avec l'operateur Like tu peux utiliser des méta-caractères, comme ?(n'importe quel caractère) ou * (=n fois n'importe quel caractère), des groupes de caractère comme [0-9] (=n'importe quel chiffre) ou [a-z] (= n'importe quel lettre minuscule).
Je te renvois à la doc de Like si tu veux en savoir plus.
0
cs_Sharkiller Messages postés 80 Date d'inscription dimanche 12 octobre 2003 Statut Membre Dernière intervention 25 avril 2011
16 août 2007 à 16:29
Ah OK, oui c'est ce que j'aurais fais, mais je pensais pas l'avoir déjà vu... Peut-être quelques fois.
Bonne continuation toutefois!

§H@®?¦££?®[mailto:$|-|@|2|<!LL?|2 ]
0
Rejoignez-nous