Importer une partie d'un fichier texte

Résolu
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006 - 21 déc. 2005 à 19:04
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006 - 22 déc. 2005 à 12:42
Bonjour à tous,
voila j'ai un dossier contenant des centaines de fichiers .txt , dans chacun d'eux il y a une ligne nommée "id_menu=quelque chose" (sans les guillemets)
Donc "id_menu" est toujours le même pour chaque fichier .txt et le "quelque chose " change a chaque fois, je désire donc automatiser en VBA l'import de cette ligne dans une table ACCESS avec :
champ1 : le nom du fichier .txt
champ2 : le "quelque chose"

j'ai pas mal cherché les imports des fichiers mais ceci :

Sub import()
Dim Fic As String
Fic = Dir("C:\66\*.txt")
Do While Fic <> ""
DoCmd.TransferText acImportDelim, "spec", "ma_table", "C:\66" & Fic
Fic = Dir
Loop
End Sub

(dans spec j'indique la specification d'import de séparateur de champ par: =)

renvoie tout le contenu de tous les fichiers (dieu que c long), j'ai bien un resultat apres a l'aide d'une requète sur ma table de tous les champs nommés "id_menu" mais je voudrais appliquer le filtre dès l'import.

Merci pour votre coup de main.
Nico

6 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 déc. 2005 à 05:06
salut,



je fais pas de VBA donc voici l'exemple en VB6 (fonctionnel).

peut-être que ton code est bon aussi (j'ai un doute quand même ^^) mais la plus grande erreur est l'écriture dans le fichier #2.

tu fais un OutPut, donc une écriture, alors qu'il faut faire un Append.




Option Explicit

'

Private Sub Command1_Click()

Call Import

End Sub

'

'

Private Sub Import()

Dim Fic As String, texte As String

Fic = Dir ("C:\66\*.txt")



Do While Fic <> ""

Open "C:\66" & Fic For Input As #1

Do While Not EOF(1)

Line Input #1, texte

If Left$(texte, 12) = "ID_MENUNAME= " Then

Open "C:\liste.txt" For Append As #2

Print #2, texte

Debug.Print Fic & " -> " & Trim$(Right$(texte, Len (texte) - 12))

Close #2

Exit Do

End If

Loop

Close #1

Fic = Dir

Loop

End Sub




<small> Coloration
syntaxique automatique [AFCK]</small>



++

PCPT [AFCK]
3
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
21 déc. 2005 à 19:56
Salut
"le filtre dès l'import" : je vois pas trop
Et il y a quoi dans ta DoCmd.TranferText ?
S'il faut gagner du temps, c'est dans cette fonction .... mais en l'absence d'info ...
- Ouvrir le fichier
- Lire chaque ligne du fichier jusqu'à trouver la ligne qui t'intéresse
- Ensuite, découper la ligne pour en extraire tes deux champs
- Abandonner la lecture de la fin du fichier (si une seule ligne "id_menu" par fichier)
- Fermer le fichier
- Insérer ces données dans la table

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
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006
22 déc. 2005 à 01:04
salut,
alors merci de me donner une piste, la structure :

- Ouvrir le fichier
- Lire chaque ligne du fichier jusqu'à trouver la ligne qui t'intéresse
- Ensuite, découper la ligne pour en extraire tes deux champs
- Abandonner la lecture de la fin du fichier (si une seule ligne "id_menu" par fichier)
- Fermer le fichier
- Insérer ces données dans la table

me semble bonne a part qu'il existe plusieurs instances de "id_menu" par fichier.
je vais trouver la traduction de ceci en code
(si vous y arrivez plus vite que moi n'hésitez pas )
merci
Nico
0
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006
22 déc. 2005 à 03:39
Alors voila j'ai trouvé une petite variante , j'extrait d'abord tout ce qui m'interesse (id_menuname) de mes fichiers texte dans un seul autre fichier texte (liste.txt) dont j'importerai les données par la suite manuellement :

Sub import()
Fic = Dir("C:\66\*.txt")
Do While Fic <> ""
Open "C:\66" & Fic For Input As #1
Fic = Dir
While Not EOF(1)
Line Input #1, texte
If Left$(texte, 12) = "ID_MENUNAME=" Then
Open "C:\liste.txt" For Output As #2
Print #2, texte
Close #2
End If
Wend
Close #1
Loop
End Sub
et voici le contenu de 2 fichiers texte differents situés dans C:\66\
Absc.txt :
ID_CLARK=For the Single Text
ID_CODENAME=ATC 3
ID_LOCATION=Facilities
ID_MENUNAME=Hypernation >>>>>>>>>> à extraire
ID_NEWSWIRE=For the Single Text
et Decal.txt :
ID_CLARK=Nothing Important
ID_CODENAME=99 Complex
ID_DATETIME=By [99]-RedBeta
ID_LOCATION=
ID_MENUNAME=Complex >>>>>>>>>> à extraire
ID_MISSION_ORDER=For the Single Text
etc
mais dans mon liste.txt ça ne renvoie que le id_menuname du Decal.txt et pas le reste.
de plus j'aimerais avoir le nom du fichier dont la donnée est extraite :
liste.txt :
Absc.txt=ID_MENUNAME=Hypernation
Decal.txt=ID_MENUNAME=Complex
etc..
J'espère que c clair et que j'en demande pas trop.
Nico ( VBnovice)
0

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

Posez votre question
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006
22 déc. 2005 à 12:05
Meci pcpt,
ton code marche très bien , seulement il n'ajoute pas le nom du fichier au début mais ce doit être une erreur de syntaxe.
Merci à tous pour votre aide.
Nico
0
7nico7 Messages postés 19 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 30 janvier 2006
22 déc. 2005 à 12:42
Voici le code corrigé :

Private Sub Import()
Dim Fic As String, texte As String
Fic = Dir("C:\66\*.txt")


Do While Fic <> ""
Open "C:\66" & Fic For Input As #1
Do While Not EOF(1)
Line Input #1, texte
If Left$(texte, 12) = "ID_MENUNAME=" Then
Open "C:\liste.txt" For Append As #2
Print #2, Fic + "=" + texte
Close #2
Exit Do
End If
Loop
Close #1
Fic = Dir
Loop
End Sub
0
Rejoignez-nous