VBA ACCESS récupérer données dans un .txt

Résolu/Fermé
tomasbruk - 4 avril 2012 à 13:19
 tomasbruk - 10 avril 2012 à 14:26
Bonjour à tous,
Afin de réaliser une mise à jour je recois un dossier composé d'une centaine de petits fichiers .txt. Chaques fichiers faisant références à un groupe (nom de fichier = nom d'un groupe).
De plus chacun de ses fichiers .txt contient les utlisateurs concernés (1 ligne du fichier .txt = 1 utilisateur).
Donc j'arrive à recuperer les noms de chaque fichier .txt afin de les mettre dans une colonne au sein d'un fichier excel ou csv.
code:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Repertoire = "C:\Documents and Settings\chemin"

'Accède au dossier
If objFSO.FolderExists(Repertoire) Then
    Set oFld = objFSO.GetFolder(Repertoire)
    MsgBox "Dossier trouvé"
Else
    MsgBox "Ce dossier n'existe pas"
End If

' extraction de la liste des groupes - utlisateurs
  Const ctePourLecture = 1
  Const ctePourEcrire = 2
  Const ctePourAjouter = 8

  On Error Resume Next
  NomFichierTxt = "Resultat.csv"
  
  Set objDossier = objFSO.GetFolder(Repertoire)
  Set objResultat = objFSO.CreateTextFile((Repertoire & "\" & NomFichierTxt), ctePourEcrire)

  If (objDossier.Files.Count > 0) Then
     For Each objFichier In objDossier.Files
        If (InStr(1, objFichier.Name, ".txt", 1) > 0) Then
            objResultat.WriteLine objFichier.Name
        End If
     Next
   End If
  objResultat.Close
  Set objResultat = Nothing
  Set objDossier = Nothing
  Set objFSO = Nothing


Mais je souhaiterais également récuperer chaque lignes contenus dans ses fichiers.
J'arrive à récupérer les lignes d'un fichier, mais je voudrais le faire pour tous les fichiers du dossier (sachant que les noms des fichiers peuvent etre différent d'une MAJ à l'autre).
Voici comment je procede pour 1 fichier:

Const ctePourLecture = 1
Const ctePourEcrire = 2
Const ctePourAjouter = 8

Dim intFic As Integer
Dim strLigne As String
Dim objFSO, objResultat
Dim Repertoire, NomFichierTxt

Set objFSO = CreateObject("Scripting.FileSystemObject")

NomFichierTxt = "Resultat2.csv"
Repertoire = "C:\Documents and Settings\chemin"
Repertoire2 = "C:\Documents and Settings\chemin du fichier"
intFic = FreeFile

Open (Repertoire2) For Input As intFic
Set objResultat = objFSO.CreateTextFile((Repertoire & "\" & NomFichierTxt), ctePourEcrire)
    
While Not EOF(intFic)
    Line Input #intFic, strLigne
    MsgBox strLigne
    objResultat.WriteLine strLigne
    
    
Wend
Close intFic



Un petit coup main me ferais du bien, car je n'y arrive pas.
Merci !

3 réponses

Bonjour,

Si j'ai bien compris ton problème, cette procédure devrait t'aider

Sub Collecter_Donnees()

Dim strLigne As String
Dim Repertoire, NomFichierTxt_Out, NomFichierTxt_Inp, NomFichierTxt_Dat

Repertoire = "C:\Documents and Settings\chemin\" 'Repertoire de travail
NomFichierTxt_Out = Repertoire & "Resultat2.csv" 'Fichier à créer
NomFichierTxt_Inp = Repertoire & "Resultat.csv"  'Fichier avec les Noms des Fichiers txt

Close 'Fermer tous les fichiers
Open NomFichierTxt_Out For Output As #1 'création du fichier Resultat2.csv
  
Open NomFichierTxt_Inp For Input As #2  'lecture du fichier Resultat.csv
	
    While Not EOF(2)
	
	   Line Input #2, strLigne 'Lecture de la ligne
	   NomFichierTxt_Dat = Repertoire & strLigne 'Nom du fichier de données
	   
	    Open NomFichierTxt_Dat For Input As #3  'Lecture du fichier de données
	    While Not EOF(3)
			Line Input #3, strLigne 'Lecture ligne de donnée
			Print #1, strLigne 'Transfert dans le fichier Resultat2.csv
		Wend
		Close #3 'Fermer Fichier de données
		
	Wend

Close 'Fermer tous les fichiers

End Sub
2
Un petit up, au cas ou !!
0
Bonjour Yoda,

Je pense que tu as compris ce que je voulais mais malheureusement, ton code ne créé pas le fichier Resultat.csv, j' ai une erreur 53 - fichier introuvable sur la ligne :
Open NomFichierTxt_Inp For Input As #2  'lecture du fichier Resultat.csv

S'en ca si je créé moi même le fichier resultat.csv je n'ai plus d'erreur mais mes 2 fichiers resultat sont vides !
0
Bonjour,

Fichier intouvable, c'est qu'il n'existe pas ou alors il n'est pas dans le répertoire indiqué
Le fichier "Resultat.csv" est bien celui que tu as déjà créé et qui contient la liste des fichiers txt à fusionner?
Vérifie la valeur de Repertoire et NomFichierTxt_Inp

rajoute ça:
'....
NomFichierTxt_Inp = Repertoire & "Resultat.csv" 'Fichier avec les Noms des Fichiers txt
MsgBox NomFichierTxt_Inp
Exit Sub

Close 'Fermer tous les fichiers

Quand tu auras réglé le problème mets ces deux lignes en commentaire

Ouvrir avec Bloc Notes le fichier Resultat.csv et regardes s'il contient bien les noms des fichiers txt à fusionner.
0
Re,
D'abord merci encore pour ton aide Yoda.
On se rapproche du but final ! mais c'est pas tout a fait.
Effectivement ton code etait correcte c'est moi qui n'ai pas verifier que mon fichier Resultat.csv contenait bien la liste.
A présent c'est le cas, je récupère bien le contenu de tout mes fichiers txt, seul souci c'est que les données se mettent dans une seul colonne du fichier Resultat2.csv ! alors que moi je souhaiterais que le 1er fichier soit mis dans la colonne 1, le fichier 2 va dans la colonne 2, et ainsi de suite....
S'en ca j'avais réussi a avoir le meme resultat que toi, mais mon code était différent, voici ce que j'avais mis (au cas ou) :
Dim Fic As String

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

Do While Fic <> ""
DoCmd.TransferText acImportDelim, , "group_user", "C:\chemin_du_dossier" & Fic    
Fic = Dir
Loop


Ah oui j'oubliais, autre différence du code, c'est que la, les données etaient mise directement dans une table.
Mais bon si déjà j'arrive à créer mon fichier resultat2.csv avec un fichier par colonne cela sera deja formidable !
0
Aïe, ça se complique.

Pour faire ça dans un fichier, il faut lire tous les txt, les mettre en tableau, et tout retranscrire ligne par ligne.
Est-ce que tous les fichiers ont le même nombre le lignes? Combien de lignes? Seulement du texte ou aussi des nombres?
Combien de fichiers txt (conbien de colonnes)?

Tu pourrais faire plus simple en important chaque fichier txt dans une table différente.
Ou encore partir d'une table vide et ajouter un champ pour chaque fichier txt à importer.

A+.
0
Ils n'ont pas tous le meme nombre de lignes, c'est aléatoire ! Au maximum y'a pas plus de 50 lignes dans les fichiers et certains sont vides.

Les lignes des fichiers txt sont comme ceux-ci :
- "CN=FR03949,OU=?????,DC=??????,DC=?????,DC=fr"
- "CN=FR03852OU=?????,DC=??????,DC=?????,DC=fr"
- "CN=FR03759,OU=?????,DC=??????,DC=?????,DC=fr"

Ensuite je selectionne toute la feuille et je remplace ca : ,OU=?????,DC=??????,DC=?????,DC=fr" par rien et idem pour ca : "CN=
Donc de la il ne reste plus que mon code utilisateur, car c'est ce code que je doit récuperer.
Il y a 131 fichiers txt dans mon répertoire.
0
Si tous les fichiers ont la même structure, c'est facile de récupérer uniquement ce qu'il y a entre "CN=" et ",OU".

Mais pourquoi les mettre en colonnes? ça va faire 50 lignes par 131 colonnes.
Si les fichiers n'ont pas la même longueur (nbre de lignes) je vois pas l'intéret de faire un tableau.
:)
0