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

Résolu
tomasbruk -  
 tomasbruk -
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

  1. Yoda
     
    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
  2. tomasbruk
     
    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
    1. Yoda
       
      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
    2. tomasbruk
       
      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
    3. Yoda
       
      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
    4. tomasbruk
       
      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
    5. Yoda
       
      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