Inserer une chaine dans un fichier text

Résolu
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004 - 30 oct. 2004 à 00:31
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004 - 1 nov. 2004 à 12:29
Voila mon problème:

J'ai un fichier text avec des données (chaine);

exemple

------------------------------------------------------------------
Nom: Prénom: Né le:
------------------------------------------------------------------
123456789....... (positions)

Et je voudrais inclure des chaines sans écraser ce qui il y a deja dans le fichier.

j'ai une Form avec par exemple 3 zones de text dans lesquels j'écrit le nom le prenom et la date de naissance.

Avec la methode sequencielle je pense pas que l'on puisse selectionner un endroit dans le fichier pour y écrire.

Avec le mode aleatoire il insert un caractere special au debut de chaque enregistrement.

Et avec le mode binary (je reprend l exemple) si j'ecrit la chaine

"Dupont" a la position 6 dans le fichier voila le resultat

------------------------------------------------------------------
Nom: Duponténom: Né le:
------------------------------------------------------------------
123456789....... (positions)

J'aimerais écrire et que le text qui se trouve apres la position ou j ecrit se décale automatiquement (un peu comme dans un traitement de text)

C'est possible en VB6????

Merci

Lemagicien

27 réponses

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
30 oct. 2004 à 00:47
Tu peux essayer de lire tout ce qu'il y'a après "Nom : ", le stocker dans une variable, et tu réécrit "Dupont"+contenu de la variable.
Comme ça tu va tout décaler. Par contre si ton fichier fait plusieurs Mo, c'est pas bon de le mettre en mémoire, mais pour plusieurs Ko ça devrait passer
@ +
MadMatt
3
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
30 oct. 2004 à 00:53
Oui mais la la nouvelle ligne sera insérée à la fin, alors qu'il veut qu'elle soit insérée au milieu.
On peut utiliser InStr pour trouver la position du texte "Nom : ", comme ça on découpe en 3 variables :
Texte avant "Nom : "
"Nom : "+"Dupont"
Texte après "Nom : "
puis on rassemble les 3 et on réécrit le fichier.
@ +
MadMatt
3
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
30 oct. 2004 à 14:28
Merci pour vos reponses.

j'ai trouvé une solution alternative.

j'ouvre le fichier "fichier.txt" je lis caractere par caractere que je recopie dans un autre fichier "fichier2.txt" et quand j arrive a l emplacement ou je veux inserer ma chaine je l ecris dans le "fichier2.txt" puis je continue a lire dans le "fichier.txt" etc...
jusqu'a la fin du fichier.

je v tester ca et si ca foncitonne je le poste sur le forum.

merci à tous
Lemagicien
3
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
30 oct. 2004 à 15:09
voila une 1er version qui foncitonne.

Private Sub Command1_Click()

Dim strChaine As String * 1
Dim i As Integer

Open "c:/fichier.txt" For Binary As #1 
Open "c:/fichier2.txt" For Binary As #2 

For i = 1 To 5
Get #1, i, strChaine
Put #2, , strChaine
Next i

Put #2, , Text1.Text
Put #2, , " "

For i = 6 To 14
Get #1, i, strChaine
Put #2, , strChaine
Next i

Put #2, , Text2.Text

Close

intMsg = MsgBox("Ecriture terminée!")

End Sub



Je prepare une autre version, obtimisée.
Qui tient compte d'un caractere special dans le fichier.

je m'explique:

je reprend mon exemple

------------------------------
Nom: Prénom:
------------------------------

ici ca va ya pas trop de donnée mais si on a un fichier avec 50 truc dans le meme genre ca devient chiant de comter les position des insertions donc j ai dans l idée ce qui suit;

-------------------------------
Nom: * Prenom: *
-------------------------------

le programme recopie caractere par caractere dans le fichier 2 et s arrete des qu il rencontre le "*" (ou autre caractere a definir)
et a se moment la il recopie dans le fichier 2 la chaine a inserer text1.text par exemple.

on continue a recopier dans le fichier 2 jusqu au moment ou l on trouve un autre "*"

voila ce que je teste pour le moment.

a+

Lemagicien
3

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

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
30 oct. 2004 à 15:55
Pour la taille max d'une variable chaine, Dixit l'aide VB6 :

Il existe deux types de chaînes : les chaînes de longueur variable et les chaînes de longueur fixe.

Les chaînes de longueur variable peuvent contenir environ 2 milliards (2^31) de caractères.

Les chaînes de longueur fixe peuvent contenir de 1 à environ 64 Ko (2^16) de caractères.

Mais c'est en théorie !

Cordialement, CanisLupus
3
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
31 oct. 2004 à 17:45
voila j' ai testé la methode avec la recherche d'un caractere special (ici "*") pour un fichier de 200Ko
L'opération a pris +/- 2sec.

Pour le moment le code insere un espace au lieu d'une chaine, dont l'operation, pour une longue liste de chaine a inserer ,devrait etre plus lognue en temps j'ai pas encore testé.

voila le code:

Private Sub Command1_Click()

Dim strTemp As String * 1

'Lire caractere par caractere et recopier dans fichier 2

Open "c:\Fichier vide.rtf" For Binary As #1
Open "c:\fichier.rtf" For Binary As #2

Do

Get #1, , strTemp      'Recupere le caractere dans strTemp
If EOF(1) Then Exit Do    'verifie si on est a la fin du fichier
If strTemp = "*" Then    'test si on a le caractere "*"
Put #2, , " "      'si on a "*" on copie un espace
Else
Put #2, , strTemp   'sinon on copie le caractére
End If
Loop

Close
intMsg = MsgBox("Ecriture terminée!")
End Sub


Lemagicien
3
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 oct. 2004 à 23:15
Ce que je voulais dire c'est que tu lis tout le fichier d'un coup (beaucoup plus rapide) (pour faire ça tu a plein de solutions différentes) et que après tu agit sur ta chaine de caractère au lieu d'agir sur le fichier. C'est à dire qu'au lieu d'utiliser des Get et des Put tu va chercher à un endroit précis de ta chaine.

Un autre avantage de faire ça : tu a la fonction InStr qui permet de trouver la position d'une chaine de caractère dans une autre.

Par exemple tu lit tout ton fichier dans la variable TOTAL. Ensuite tu trouve la position à laquelle il faut placer le nom de l'utilisateur :

' La tu cherche la position de "Nom : "
Pos = Instr(TOTAL, "Nom : ")
' Tu te décale pour que ta position soit après "Nom : "
Pos = Pos + Len("Nom : ")
' La pour "insérer" le nom de ton utilisateur, tu découpe en 3 chaines
Str1 = Left(TOTAL, Pos - Len("Nom : "))
Str2 = Mid(TOTAL, Pos - Len("Nom : "), Len("Nom : "))
Str3 = Right(TOTAL, Len("Nom : ") - Pos)
' A ce stade, c'est la variable 2 qui contient le nom de l'utilisateur, tu peux le lire et le modifier
Ensuite tu réécrit
TOTAL = Str1 + Str2 + Str3
' Puis tu peux faire toutes les autres modif en utilisant le meme procédé (tu peux faire un fonction)
' Puis tu réécrit dans le fichier la variable TOTAL


Et ouala ! :)

je crois que ça devrait marcher, mais programmer en aveugle c'est toujours risqué.

@ +
MadMatt
3
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
31 oct. 2004 à 23:19
Je retire ma question j'ai trouvé :)

Private Sub Command1_Click()

Open "c:/Fichier.txt" For Binary As #1 'ouverture du fichier

strValeur = Input(LOF(1), #1)

Text1.Text = strValeur 'optionnel

Close #intNum

intMsg = MsgBox("Lecture terminée!")

End Sub



Pour mettre dans un string le contenu d'un fichier de 15Mo il faut +/- 20sec
Lemagicien
3
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
1 nov. 2004 à 12:29
Voila j'ai testé la meme chose mais en sequenciel plutot qu en binaire pour un fichier de 15Mo ca prend +/-2sec pour le stoquer dans la variable

Private Sub Command1_Click()
'Lire des données dans un fichier sequenciel

intNum = FreeFile 'un numero de fichier libre

Open "c:/bizik.rtf" For Input As #intNum 'ouverture du fichier

strValeur = input(LOF(1), #1)

Close #intNum

intMsg = MsgBox("Lecture terminée!")
End Sub

Lemagicien
3
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
30 oct. 2004 à 00:48
Oui largement possible :

Il doit éxister d'autres méthodes mais celle-ci fonctionne également :

    Open "c:\toto.txt" For Input As #1  'ouvre pour la lecture
        textes = input$(LOF(1), #1)   'Lit le contenu du fichier
    Close #1   'Ferme le fichier
    Open "c:\toto.txt" For Output As #1   'Ouvre en écriture
        Print #1, textes   'ecrit le texte déjà récupérer précédement
        Print #1, "Ma nouvelle ligne est ici"   'Inscrit ligne supplémentaire
    Close #1   'Ferme le fichier


Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
30 oct. 2004 à 00:55
Sorry c'est pas ce que j'avais compris.

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
30 oct. 2004 à 14:17
Lemagicien
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
30 oct. 2004 à 14:38
Oui ça ça devrait marcher, mais ça risque d'être super lent car lire octet par octet c'est lent.
Alors que si tu lit tout le fichier d'un coup ça passera ptèt mieux, enfin tu verra
@ +
MadMatt
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
30 oct. 2004 à 15:13
Bin en binaire ca devrai etre quand meme rapide (je pense)

en fait le fichier txt dans lequel je veux inserer des chaines et plutot gros donc stoquer en mememoir une grosse partie du text serait peut etre pas plus mal je testerai les 2 pour voir la plus rapide.

Lemagicien
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
30 oct. 2004 à 15:26
Si vous pouviez me dire le nombre de caractere que l'on peut mettre au maximum dnas une variable string ca m aidrait.

Merci
Lemagicien
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
31 oct. 2004 à 02:00
Merci pour ta réponse.

a+
Lemagicien
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
31 oct. 2004 à 19:18
As-tu pensé à l'instruction Replace ?

Par exemple, une chaine s1 contenant "toto*truc*machin"
replace(s1,"*"," ") renvoie "toto truc machin".

Ca pourrait t'être utile ?

Cordialement, CanisLupus
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 oct. 2004 à 21:07
+/- 2 sec pour 200Ko ça passe, mais j'ai un programme qui code les fichiers (le codage ne prend pas beaucoup de temps) et dès que je m'attaque à 1-2 Mo ça prend plus de temps, et je te parle pas de 10 meme 100 Mo.
Il faut se dire que l'utilisateur pensera que ton programme plante alors qu'en fait il travaille.

Pense donc à faire une progressbar, ou utiliser des DoEvents (bien qu'ils ralentissent l'opération) si tu compte faire ça sur des durées > 1s

@ +
MadMatt
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
31 oct. 2004 à 22:28
CanisLupus merci je v tester ce que tu me proposes.

MadM@tt le probleme ne se pose pas pour l application que je develope.

en effet je dois creer un programme qui genere un rappot d'expertise en fichier rtf.

le document est imposé par la firme.

il y a des champ libre, exemple nom prenom, date d expertise, donnée d'espertises etc...

le document vierge donc sans les données mais uniquement avec les caracteres qui ne change jamais (nom prenom etc) fait 200Ko et mon programme remplit les blanc en qq sorte.

pour diminuer le temps de generation du rapport je pourais toujours mettre a jour le contenu du fichier au fur et a mesure que l utilisateur entre des données sur les feuilles.

j 'ai crée plusieur veuilles avec des etapes (de 1 a 10) sur chaque feuille l utilisateur entre des données.

je peux donc inclure les données dans le fichier apres chaque etape.

mais c est vrai que si on veut utiliser mon code pour une autre application cela risque de poser qq probleme de temps...

Mais si il existe une solution plus rapide je suis preneur...

Lemagicien
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 oct. 2004 à 22:37
Si le problème de rapidité ne se pose pas pour ton programme alors ne t'embête pas ;)
@ +
MadMatt
0
Rejoignez-nous