Recherche liste mot dans plusieurs fichiers

Bonjour

je sollicite votre aide car je galère

- J'ai un fichier "liste.txt" qui se présente sous la forme suivante :

mot1

mot2

mot3

etc ...

- Un répertoire de recherche "rep" qui contient plusieurs fichiers (de différents types) ainsi que des sous répertoire:

fichier1

fichier2

fichier3

sous_rep

fichier100

fichier101

etc...

Je souhaiterais créer un script/batch qui exécuterait la tache suivante :

Pour chaque mot de "liste.txt", rechercher si le mot existe dans les fichiers sous "rep" incluant ses sous répertoires et me renverrais le résultat dans un fichier texte sous la forme suivante :

mot1 présent dans fichier1, fichier2, fichier6,...

mot2 présent dans fichier1, fichier3, fichier4...

etc....

merci d'avance pour votre aide

Cordialement

Cédric

bonjour Indemyx,

bonjour le forum,

une proposition

Sub aargh()
    Sheets.Add
    lmf = "d:\downloads\listemots.txt"
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.OpenTextfile(lmf)
    r = ts.readall
    ts.Close
    lm = Split(r, vbNewLine)
    Cells(1, 1).Resize(UBound(lm)) = Application.Transpose(lm)
    lfr "d:\downloads\", "*.txt", lm
    Open "resultats.txt" For Output As 1
    i = 1
    While Cells(i, 1) <> ""
        Ligne = Cells(i, 1) & " présent dans "
        j = 2
        sep = ""
        While Cells(i, j) <> ""
            Ligne = Ligne & sep & Cells(i, j)
            If sep = "" Then sep = ", "
            j = j + 1
        Wend
        If j > 2 Then Print #1, Ligne
        i = i + 1
    Wend
    Close 1
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub

Sub lfr(rep, filtre, lm, Optional n = 0)
    Set fso = CreateObject("scripting.filesystemobject")
    Set rep = fso.getfolder(rep)
    For Each repf In rep.subFolders
        lfr repf, filtre, lm, n + 1
    Next repf
    For Each f In rep.Files
        fn = f.Name
        If f.Name Like filtre Then
            Set ts = fso.OpenTextfile(f.Path)
            r = ts.readall
            For i = LBound(lm) To UBound(lm)
                If lm(i) <> "" Then
                    lig = i + IIf(LBound(lm) = 0, 1, 0)
                    If InStr(r, lm(i)) <> 0 Then
                        dc = Cells(lig, Columns.Count).End(xlToLeft).Column + 1
                        Cells(lig, dc) = f.Path
                    End If
                End If
            Next i
            ts.Close
        End If
    Next f
End Sub

Salut H2So4 (pas très rassurant comme nom quand on a bossé dans une raffinerie )

Merci pour ta réponse.

je vais tester ça

l

Re-bonjour,

Bon j'ai un petit soucie à l'éxécution de la macro :

"Erreur d'éxécution '62' : l'entrée dépasse la fin de fichier"

Débogage --> r = ts.readall (dans la Sub lfr)

Une idée ?

bonsoir,

je suppose qu'il s'agit d'un très gros fichier > 2GB ?

Il s'agit d'un gros répertoire avec plusieurs sous répertoire, mais en soi les fichier dans ces derniers ne sont pas si gros (quelques Mo)

Bonjour,

je ne comprends pas vraiment d'où vient le problème (je soupçonne une corruption dans un des fichiers), mais essaie ceci

Sub aargh()
    Sheets.Add
    lmf = "d:\downloads\liste.txt"
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.OpenTextfile(lmf)
    r = ts.readall
    ts.Close
    lm = Split(r, vbNewLine)
    Cells(1, 1).Resize(UBound(lm)) = Application.Transpose(lm)
    lfr "d:\downloads\", "*.txt", lm
    Open "resultats.txt" For Output As 1
    i = 1
    While Cells(i, 1) <> ""
        Ligne = Cells(i, 1) & " présent dans "
        j = 2
        sep = ""
        While Cells(i, j) <> ""
            Ligne = Ligne & sep & Cells(i, j)
            If sep = "" Then sep = ", "
            j = j + 1
        Wend
        If j > 2 Then Print #1, Ligne
        i = i + 1
    Wend
    Close 1
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub

Sub lfr(rep, filtre, lm, Optional n = 0)
    Set fso = CreateObject("scripting.filesystemobject")
    Set rep = fso.getfolder(rep)
    For Each repf In rep.subFolders
        lfr repf, filtre, lm, n + 1
    Next repf
    For Each f In rep.Files
        fn = f.Name
        If f.Name Like filtre Then
            Set ts = fso.OpenTextfile(f.Path)
            Do While ts.AtEndOfStream <> True
            r = ts.readline
            For i = LBound(lm) To UBound(lm)
                If lm(i) <> "" Then
                    lig = i + IIf(LBound(lm) = 0, 1, 0)
                    If InStr(r, lm(i)) <> 0 Then
                        dc = Cells(lig, Columns.Count).End(xlToLeft).Column + 1
                        Cells(lig, dc) = f.Path
                    End If
                End If
            Next i
            Loop
            ts.Close
            Set ts = Nothing
        End If
    Next f
    Set rep = Nothing
    Set fso = Nothing
End Sub
Rechercher des sujets similaires à "recherche liste mot fichiers"