Inserer une chaine dans un fichier text [Résolu]

Signaler
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004
-
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004
-
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

Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
15
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
14
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]
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
14
Sorry c'est pas ce que j'avais compris.

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

Lemagicien
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

Merci pour ta réponse.

a+
Lemagicien
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
15
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
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

+/- 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
Messages postés
95
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2004

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
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

Si le problème de rapidité ne se pose pas pour ton programme alors ne t'embête pas ;)
@ +
MadMatt