Manipulation txt

neogenius1980 - 15 déc. 2012 à 01:02
 Utilisateur anonyme - 15 déc. 2012 à 16:47
Bonjour,
J'ai un problème, je voudrais insérer une phrase ou un mot, dans un fichier '.txt' existant sans écraser les données qui sont dans ce même fichier. Je suis sous access 2003.
Et voici mon code :

Sub OpenTextFileTest()
Const ForReading 1, ForWriting 2, ForAppending = 8
Dim fso, f
Dim txt_name As String
txt_name = "monfichier.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(CurrentProject.Path & "" & txt_name, ForAppending)
f.Write "Bonjour!"
f.Close
End Sub

Le problème du ForAppending c'est qu'il ajoute à la fin du txt, alors que le ForWritting écrase complètement mes données dans le fichier.
Merci de votre aide.

12 réponses

Utilisateur anonyme
15 déc. 2012 à 01:17
Bonjour,
Tu l'as bien dit:
Le problème du ForAppending c'est qu'il ajoute à la fin du txt

Il te faut donc dans un premier temps lire le texte de ton fichier, le garder dans une variable, en suite rajouter ton 'bonjour' au début de ta variable et écrire le tout en écrasant (ForWriting)

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
15 déc. 2012 à 01:51
Essaye donc ça, et tu me diras ce que t'as compris:
Dim Num, Compt As Integer
Dim Texte As String
Dim Lignes(100) As String '100 lignes de texte au max
'On lit le fichier:
Open "c:\users\carlos\desktop\TEXTE.txt" For Input As #1
  Do While Not EOF(1)
     Num = Num + 1
     Line Input #1, Texte
     Lignes(Num) = Texte
  Loop
Close
'On efface le fichier
Kill "c:\users\carlos\desktop\TEXTE.txt"
'On écrit le tout avec le 'bonjour' au début tout en créant le fichier
Open "c:\users\carlos\desktop\TEXTE.txt" For Append As #1
   Print #1, "Bonjour,"
   For Compt = 1 To Num
       Print #1, Lignes(Compt)
   Next Compt
Close


Bien entendu tu changeras le "c:\users\carlos\desktop\TEXTE.txt" par le chemin de ton fichier...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 déc. 2012 à 03:54
Salut

Le plus économe en mémoire serait de lire le fichier original et de recréer un nouveau fichier - en y insérant les lignes voulues - de refermer les 2 fichiers, de détruire l'original et enfin de renommer le nouveau fichier avec le nom de l'ancien.
Comme ça, la seule mémoire dont tu aies besoin ne sera que d'une ligne du fichier.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
neogenius1980
15 déc. 2012 à 11:21
Merci à tous de votre aide surtout à Carlos de la guadeloupe.
Vos codes m'ont bien aidé, néanmoins j'ai essayé de le faire avec plusieurs lignes à la place du "bonjour":
"load data infile *"
"append into table h_cap_abs_ind"
"fields terminated by ';'"
"("
" CP_AE_AGENETAB,"
" CP_AB_CODABS,"
" CP_DATREF,"
" CP_NBJOURS,"
" CP_NBHRES,"
" CP_REGUL"
")"
"BEGINDATA"

j'essaie de combiner ces deux codes :
code 1 :
Sub ecrire_dans_txt()
Dim txt_name As String
txt_name = "code_entete.txt"
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFic = FSys.CreateTextFile(CurrentProject.Path & "" & txt_name)
With MonFic 'Pour écrire dans le fichier texte
.WriteLine "load data infile *" 'Mettre write pour ne pas sauter à la ligne
.WriteLine "append into table h_cap_abs_ind"
.WriteLine "fields terminated by ';'"
.WriteLine "("
.WriteLine " CP_AE_AGENETAB,"
.WriteLine " CP_AB_CODABS,"
.WriteLine " CP_DATREF,"
.WriteLine " CP_NBJOURS,"
.WriteLine " CP_NBHRES,"
.WriteLine " CP_REGUL"
.WriteLine ")"
.WriteLine "BEGINDATA"
End With
Msg = "Écriture réussie dans fichier.txt"
MsgBox (Msg)
End Sub

code 2 (un transfert de table):
Public Sub generation_fichier_rtt()
Dim txt_name As String
txt_code = "rtt_a_integrer.txt"
DoCmd.TransferText acExportDelim, "RTT_A_GENERER Spécification d'exportation", "RTT_A_GENERER", CurrentProject.Path & "" & txt_name, False, ""
End Sub

le code 1 doit être générer avant le code 2, d'où ma demande précédente. Les deux codes écrase les données à chaque exécution. La méthode de Carlos génère bien une insertion mais sur une ligne, mon problème concerne tout un bloc.
Je suis encore novice. Si quelqu'un pouvait me venir en aide
Merci d'avance.
0

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

Posez votre question
neogenius1980
15 déc. 2012 à 14:16
ça y est j'ai réussi :


Dim Num, Compt As Integer
Dim Texte As String
Dim Lignes(600) As String '600 lignes de texte au max
Dim txt_name As String
txt_name = "rtt_a_integrer.txt"

'Générer le fichier RTT_principal
DoCmd.TransferText acExportDelim, "RTT_A_GENERER Spécification d'exportation", "RTT_A_GENERER", CurrentProject.Path & "" & txt_name, False, ""

'On lit le fichier code:
Open CurrentProject.Path & "" & txt_name For Input As #1
Do While Not EOF(1)
Num = Num + 1
Line Input #1, Texte
Lignes(Num) = Texte
Loop
Close

'On efface le fichier
Kill CurrentProject.Path & "" & txt_name

'On écrit le tout avec le 'bonjour' au début tout en créant le fichier
Open CurrentProject.Path & "" & txt_name For Append As #1
Print #1, "load data infile *" _
& vbNewLine & "append into table h_cap_abs_ind" _
& vbNewLine & "fields terminated by ';'" _
& vbNewLine & "(" _
& vbNewLine & " CP_AE_AGENETAB," _
& vbNewLine & " CP_AB_CODABS," _
& vbNewLine & " CP_DATREF," _
& vbNewLine & " CP_NBJOURS," _
& vbNewLine & " CP_NBHRES," _
& vbNewLine & " CP_REGUL" _
& vbNewLine & ")" _
& vbNewLine & "BEGINDATA"
For Compt = 1 To Num
Print #1, Lignes(Compt)
Next Compt
Close

Merci encore à carlos!!!!
0
Utilisateur anonyme
15 déc. 2012 à 14:25
Re:
Alors on va partir du principe que le fichier à lire a plusieurs blocs de texte (plusieurs lignes) puisque je ne connais pas ton fichier, ni ce que tu veux en faire exactement;

J'ai imaginé deux cas de figure:
1) Le cas où tu veux insérer un texte à la suite d'un mot ou chaines de caractères connue d'avance:

Dim Position_du_Mot_Rech As Integer
Dim Texte_Lu, Texte_a_Insérer, Mot_Recherché As String
Dim Fichier_a_Lire, Fichier_Modifié As String

Fichier_a_Lire = "c:\users\carlos\desktop\TEXTE.txt"
Fichier_Modifié = "c:\users\carlos\desktop\TEXTE_NEW.txt"

'Textes de ton choix:
Texte_a_Insérer = " [Texte inséré] "
Mot_Recherché = "demain" 'Mot à la suite duquel le texte à insérer sera inséré

'on crée le nouveau fichier en mode écriture (le #1):
Open Fichier_Modifié For Append As #1
'On ouvre le fichier original pour lecture (le #2):
Open Fichier_a_Lire For Input As #2
  Do While Not EOF(2)
     Line Input #2, Texte_Lu 'on lit la ligne
     Position_du_Mot_Rech = InStr(Texte_Lu, Mot_Recherché) - 1
     
     If Position_du_Mot_Rech > 0 Then 'Si le mot recherché existe dans le bloc texte:
        'on écrit ce qui est à gauche du mot recherché,
        'le mot recherché,
        'le texte à insérer,
        'et ce qui est à droite du mot recherché
        Print #1, Left(Texte_Lu, Position_du_Mot_Rech) & _
              Mot_Recherché & Texte_a_Insérer & _
              Right(Texte_Lu, (Len(Texte_Lu) - 1 - (Position_du_Mot_Rech + Len(Position_du_Mot_Rech) + 4)))
     Else
        Print #1, Texte_Lu 'Sinon il écrit la ligne normalement
     End If
  Loop
Close

'on efface l'ancien fichier et on renome le nouveau
Kill Fichier_a_Lire
Name Fichier_Modifié As Fichier_a_Lire


2) Le cas où tu dois insérer le texte à un emplacement spécifique:
Dim Position_DInsértion As Integer
Dim Texte_Lu, Texte_a_Insérer, Fichier_a_Lire, Fichier_Modifié As String

Fichier_a_Lire = "c:\users\carlos\desktop\TEXTE.txt"
Fichier_Modifié = "c:\users\carlos\desktop\TEXTE_NEW.txt"

'Texte de ton choix:
Texte_a_Insérer = " [Texte inséré] "
'Position où insérer le texte dans toutes les lignes (blocs de texte)
'(Position 1 = premier caractère)
Position_DInsértion = 3
'dans ce cas le texte sera inséré entre la 3° et la 4° lettre du texte

'on crée le nouveau fichier en mode écriture (le #1):
Open Fichier_Modifié For Append As #1
'On ouvre le fichier original pour lecture (le #2):
Open Fichier_a_Lire For Input As #2
  Do While Not EOF(2)
     Line Input #2, Texte_Lu 'on lit la ligne
        'on écrit ce qui est à gauche de la position d'insertion,
        'le texte à insérer,
        'et ce qui est à droite de la position d'insertion,
        Print #1, Left(Texte_Lu, Position_DInsértion) & _
              Texte_a_Insérer & _
              Right(Texte_Lu, (Len(Texte_Lu) - Position_DInsértion))
  Loop
Close

'on efface l'ancien fichier et on renome le nouveau
Kill Fichier_a_Lire
Name Fichier_Modifié As Fichier_a_Lire


Comme Jack a très bien remarqué, le plus simple c'est d'ouvrir les deux fichiers en même temps, les traiter, et en suite effacer celui qui nous sert plus.

Et à l'avenir, pour nous permettre de comprendre, quand tu mets du code sur le forum utilise les balises de code vb qui sont destinées à cet effet (troisième icône en partant de la droite)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
15 déc. 2012 à 14:28
On a fini en même temps on dirait...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
15 déc. 2012 à 14:36
Oui alors c'est pas ce que j'ai compris finalement,
Il existe plusieurs façons de le faire, tu peux remplacer ça:
Print #1, "load data infile *" _ 
& vbNewLine & "append into table h_cap_abs_ind" _ 
& vbNewLine & "fields terminated by ';'" _ 
& vbNewLine & "(" _ 
& vbNewLine & " CP_AE_AGENETAB," _ 
& vbNewLine & " CP_AB_CODABS," _ 
& vbNewLine & " CP_DATREF," _ 
& vbNewLine & " CP_NBJOURS," _ 
& vbNewLine & " CP_NBHRES," _ 
& vbNewLine & " CP_REGUL" _ 
& vbNewLine & ")" _ 
& vbNewLine & "BEGINDATA" 

Par:
Print #1, "load data infile *"
Print #1, "append into table h_cap_abs_ind" 
Print #1, "fields terminated by ';'"
Print #1, "("
Print #1, " CP_AE_AGENETAB,"
Print #1, " CP_AB_CODABS,"
Print #1, " CP_DATREF,"
Print #1, " CP_NBJOURS,"
Print #1, " CP_NBHRES,"
Print #1, " CP_REGUL"
Print #1, ")"
Print #1, "BEGINDATA" 


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
neogenius1980
15 déc. 2012 à 14:49
Merci encore pour tous ses précieux conseils, et de m'avoir consacré de votre temps.

Cdt
0
Utilisateur anonyme
15 déc. 2012 à 15:14
Simplifie-le comme ça alors:
Dim Num, Compt As Integer
Dim Lignes(600) As String '600 lignes de texte au max
Dim Texte, txt_name As String
Dim Texte_a_Insérer, Fichier_Modifié As String

Num = 0
txt_name = CurrentProject.Path & "\rtt_a_integrer.txt"
Fichier_Modifié = Left(txt_name, (Len(txt_name) - 4)) & "_new.txt"

'Générer le fichier RTT_principal
DoCmd.TransferText acExportDelim, "RTT_A_GENERER Spécification d'exportation", "RTT_A_GENERER", txt_name, False, ""

Texte_a_Insérer = "load data infile *" & vbCrLf & _
                  "append into table h_cap_abs_ind" & vbCrLf & _
                  "fields terminated by ';'" & vbCrLf & _
                  "(" & vbCrLf & _
                  " CP_AE_AGENETAB," & vbCrLf & _
                  " CP_AB_CODABS," & vbCrLf & _
                  " CP_DATREF," & vbCrLf & _
                  " CP_NBJOURS," & vbCrLf & _
                  " CP_NBHRES," & vbCrLf & _
                  " CP_REGUL" & vbCrLf & _
                  ")" & vbCrLf & _
                  "BEGINDATA" & vbCrLf

'on crée le nouveau fichier en mode écriture (le #1):
Open Fichier_Modifié For Append As #1
'On ouvre le fichier original pour lecture (le #2):
Open txt_name For Input As #2 'attention en mode 'Input' si le fichier n'existe pas une erreur apparait
   Do While Not EOF(2)
      Num = Num + 1
      Line Input #2, Texte
      Lignes(Num) = Texte
   Loop
   Print #1, Texte_a_Insérer
   For Compt = 1 To Num
       Print #1, Lignes(Compt)
   Next Compt
Close
'on efface l'ancien fichier et on renome le nouveau
Kill txt_name
'on renome le nouvel fichier
Name Fichier_Modifié As txt_name


Ça devrait fonctionner chez toi, et comme dit Jack t'économises de la mémoire.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
neogenius1980
15 déc. 2012 à 16:45
je viens de le tester...chapeau !!!
on sent le passionné!!!
Bravo et encore merci
0
Utilisateur anonyme
15 déc. 2012 à 16:47
De rien...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous