如何查找某字符串在多个文件夹下txt文件中出现次数

时间:2022-05-12 09:56:22
    现在假设D:\DATA的下有诺干文件夹,文件夹名为日期,格式是:日(2位数字)+月(3位大写字母)+年(2位数字)。如:15MAY08(表示2008-03-15) 01AUG08(表示2008-08-01)等
文件夹下有一些文件,格式有两种,只需txt格式的内容。
    现在想实现如下功能,假设我输入某个字符串和2个时间,可否查找这个字符串出现的次数。例如,输入“aaa","2008-05-01","2008-05-31",就可以查找在DATA下,01MAY08,02MAY08,03MAY08,...,31MAY08(共31个文件夹,大概150M的文本文件待查)下所有txt文件中"aaa"出现的次数。
    更进一步,可否给出的结果更细致一些,可以给出在各个文件中出现的次数,比如结果显示:txt1:2次  txt2:3次  txt31:5次 一共10次 (所有待查文件均不可能重名,即使不是一个文件夹下也不可能)。
    这类资料很少查到,而且VB初学,希望高手可以不吝赐教。关键是第一个问题,希望可以给出完整代码。知道分数很少,但还是大家请帮帮忙,谢谢!

19 个解决方案

#1


一个月就有 150M  文件

如果是读出每一个Txt 文件,再去比对. 虽然能得出结果.

但是机器要运行多久?

不会睡一觉再起来看吧? 

#2


findfirstfile函数能作你想要的

#3


我也知道时间会很长 但暂时没有更好的办法 所以时间上就不去考虑 我让他操作后就放那里放着了 等几个小时在去看结果 主要是如何实现这样的功能 希望有高手可以指教

#4


使用API(一是VB里面自带函数功能比较弱。二是API比大部分VB函数效率高)
查找文件:
FindFirstFile和FindNextFile两个函数配合使用。具体见MSDN。。

搜索文件:
建议楼主使用API全局打开,将整个文件当作一个长字串处理。具体函数一时想不起来。。不行就自己写个。

#5


只用vb好像也可以做到,也不太复杂,比如找文件,你可以不找文件,而是直接打开文件,如果打开出错就表明没有这个文件,当然,这样文件名得有规律,如果没有规律,也可以用vb自带的dir函数,因为文件夹的名字已经有规律了。

#6


可以给个大致的程序或思路或者相关的查询内容吗?

#7



'查找文件夹.命令
  if dir("文件夹名")<>"" then
    '再去查找文件
     while dir("*.txt")<>""
       '打开每一个文件.
       '最好读到richtextbox控件中
        '对文件分析.查找
        '用richtextbox的查找功能 richtextbox.Find 直到返回值为0
    wend 
  end if

#8


我先看看 比较一下VB和API哪个更好些 谢谢楼上的几位
 如果谁有更好的办法 麻烦在提示下 呵呵

#9


请问我怎样才能根据日期确定要读取哪些文件夹里的内容?假设是用DTPicker控件输入日期,同时假设日期文件夹是连贯的(即:每天都有一个文件夹)。初学VB,希望高手指教一下。给个大致的思路和要使用的函数就行,谢谢

#10


dim strFileName as string
'根据日期转换成你的格式
'日(2位数字)+月(3位大写字母)+年(2位数字)

strFileName=你转换后的名字 & ".txt"

open strFileName 就可以了

#11


我的意思是,比如我的日期输入的是:2008-05-01 和 2008-06-30 我要查找的是01MAY08,02MAY08,...31MAY08,01JUN08,02JUN08,...,30JUN08,这样的改怎么做?

#12


我的意思是,比如我的日期输入的是:2008-05-01 和 2008-06-30 我要查找的是01MAY08,02MAY08,...31MAY08,01JUN08,02JUN08,...,30JUN08这61个文件夹以及他们下面所有的文件,这样的改怎么做?

#13




Function FolderCheck(ByVal d1 As Date, ByVal d2 As Date, ByVal FolderName As String) As Boolean
'参数说明:d1起始日期,d2终止日期,FolderName文件夹名称字符串
    
    Dim FolderDate As String
    Dim FolderMonth
    
    If Len(FolderName) <> 7 Then Exit Function
    '获取文件夹名称中的英文月
    FolderMonth = LCase(Mid(FolderName, 3, 3))
    '英文月转换为对应的数字
    FolderMonth = InStr(LCase("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"), FolderMonth)
    FolderMonth = (Val(FolderMonth) + 3) / 4
    '文件夹名称还原为日期
    FolderDate = "20" & Left(FolderName, 2) & "-" & FolderMonth & "-" & Right(FolderName, 2)
    If IsDate(FolderDate) Then
        '如果文件夹是日期,检验日期范围
        If CDate(FolderDate) >= d1 And CDate(FolderDate) <= d2 Then
            FolderCheck = True
        End If
    End If
    
End Function

#14


Option Explicit

Sub Main()
    Dim dtStart As Date
    Dim dtFinish As Date
    Dim dt As Date
    Dim pID As Long
    
    dtStart = CDate("2008-05-01")
    dtFinish = CDate("2008-05-31")
    For dt = dtStart To dtFinish
        pID = Shell("cmd.exe /c Find /C ""aaa"" D:\DATA\" & Format(dt, "ddMMMyy") & "\*.txt > D:\DATA\FIND.txt")
        
        '用 http://blog.csdn.net/jyh_jack/archive/2008/06/16/2552463.aspx 的方法等待结束
        
        'D:\DATA\FIND.txt 中注明了每个 txt 包含 "aaa" 的次数,解析这个文件就可以了
    Next
End Sub

#15


顶老鸟

#16


Private Sub Command1_Click()
    Dim strTemp As String
    Dim intFileNo As Integer
    Dim strPath As String
    
    Dim strDateFrom As String
    Dim strDateTo As String
    Dim lngDatehCnt As Long
    
    Dim strResult() As String
    Dim lngTotalCnt As Long
    
    strPath = "C:\TXT\"
    
    strDateFrom = Text1.Text
    strDateTo = Text2.Text
    
    lngDatehCnt = DateDiff("d", CDate(strDateFrom), CDate(strDateTo))
    
    For LngLoop = 0 To lngDatehCnt - 1
    
        strPath = strPath & Format(Day(DateAdd("d", LngLoop, CDate(strDateFrom))), "00")
        strPath = strPath & Left(MonthName(Month(DateAdd("d", LngLoop, CDate(strDateFrom)))), 3)
        strPath = strPath & Right(Year((DateAdd("d", LngLoop, CDate(strDateFrom)))), 2)
        strPath = strPath & ".txt"
        
        intFileNo = FreeFile
        Open strPath For Input As intFileNo
        strTemp = StrConv(InputB(LOF(1), intFileNo), vbUnicode)
        Close intFileNo
        
        strResult = Split(strTemp, "aaa")
        lngTotalCnt = lngTotalCnt + (UBound(strResult) - 1)
    Next
    
    
    MsgBox lngTotalCnt
    
End Sub

#17


循环当前的文件夹,到里面判断扩展名为.txt的文件,再读取文件内的信息!

#18


吃饭了没事,我也来凑一个热闹:



'文件夹检测
Function FolderCheck(ByVal d1 As Date, ByVal d2 As Date, ByVal FolderName As String) As Boolean
'参数说明:d1起始日期,d2终止日期,FolderName文件夹名称字符串
    
    Dim FolderDate As String
    If Len(FolderName) <> 7 Then Exit Function
    FolderDate = "20" & Right(FolderName, 2) & "-" & Mid(FolderName, 3, 3) & "-" & Left(FolderName, 2)
    FolderDate = Format(FolderDate, "yyyy-mmm-dd")
    'Debug.Print FolderDate
    If IsDate(FolderDate) Then
        '如果文件夹是日期,检验日期范围
        If CDate(FolderDate) >= d1 And CDate(FolderDate) <= d2 Then
            FolderCheck = True
        End If
    End If
    
End Function

'读取文件信息,返回sFind出现的次数
Function GetFileInfo(ByVal FileName As String, sFind As String) As Long
    Dim h As Long
    Dim tmp As String
    h = FreeFile()
    Open FileName For Binary As h
        tmp = Space(LOF(h))
        Get #h, , tmp
    Close
    GetFileInfo = UBound(Split(tmp, sFind))
End Function

'输出结果
Sub PrintValues(ByVal sFind As String, ByVal bDate As Date, ByVal eDate As Date)

    Dim FolderPath As String, FolderName As String
    Dim FilePath As String, FileName As String
    Dim FolderInfo As Long
    Dim FileInfo As Long
    Dim ColInfo As Long
    Dim col As Collection
    Dim i As Long
    
    '搜索符合条件的文件夹,并加入集合中
    Set col = New Collection
    FolderPath = App.Path & "\DATA\"
    FolderName = Dir(FolderPath, vbDirectory)
    Do While FolderName <> ""
        If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
            If FolderCheck(bDate, eDate, Trim(FolderName)) Then
                col.Add FolderName
            End If
        End If
        FolderName = Dir
    Loop
    
    '循环集合,读取文件夹下的txt文件
    For i = 1 To col.Count
        FilePath = FolderPath & col(i) & "\"
        FileName = Dir(FilePath & "*.txt")
        FolderInfo = 0
        Do While FileName <> ""
            '当前txt文件中出现sFind的次数
            FileInfo = GetFileInfo(FilePath & FileName, sFind)
            '输出当前txt文件中出现sFind的次数
            Debug.Print FilePath & FileName & ": " & FileInfo
            '统计这个文件下所有txt中出现sFind的总数
            FolderInfo = FolderInfo + FileInfo
            FileName = Dir
        Loop
        '输出这个文件下所有txt中出现sFind的总数
        Debug.Print FilePath & ": " & FolderInfo
        '总数
        ColInfo = ColInfo + FolderInfo
    Next
    '输出总数
    Debug.Print FolderPath & ": " & ColInfo
    
    Set col = Nothing
End Sub

'测试
Private Sub Command1_Click()
    PrintValues "aaa", "2008-7-21", "2008-8-5"
End Sub

#19


多谢楼上的朋友们了 参考各位的提示 已经用自己的方法写出来了 结贴给分 我感觉给我启示大的就多给 少的就少给 谢谢各位的帮忙

#1


一个月就有 150M  文件

如果是读出每一个Txt 文件,再去比对. 虽然能得出结果.

但是机器要运行多久?

不会睡一觉再起来看吧? 

#2


findfirstfile函数能作你想要的

#3


我也知道时间会很长 但暂时没有更好的办法 所以时间上就不去考虑 我让他操作后就放那里放着了 等几个小时在去看结果 主要是如何实现这样的功能 希望有高手可以指教

#4


使用API(一是VB里面自带函数功能比较弱。二是API比大部分VB函数效率高)
查找文件:
FindFirstFile和FindNextFile两个函数配合使用。具体见MSDN。。

搜索文件:
建议楼主使用API全局打开,将整个文件当作一个长字串处理。具体函数一时想不起来。。不行就自己写个。

#5


只用vb好像也可以做到,也不太复杂,比如找文件,你可以不找文件,而是直接打开文件,如果打开出错就表明没有这个文件,当然,这样文件名得有规律,如果没有规律,也可以用vb自带的dir函数,因为文件夹的名字已经有规律了。

#6


可以给个大致的程序或思路或者相关的查询内容吗?

#7



'查找文件夹.命令
  if dir("文件夹名")<>"" then
    '再去查找文件
     while dir("*.txt")<>""
       '打开每一个文件.
       '最好读到richtextbox控件中
        '对文件分析.查找
        '用richtextbox的查找功能 richtextbox.Find 直到返回值为0
    wend 
  end if

#8


我先看看 比较一下VB和API哪个更好些 谢谢楼上的几位
 如果谁有更好的办法 麻烦在提示下 呵呵

#9


请问我怎样才能根据日期确定要读取哪些文件夹里的内容?假设是用DTPicker控件输入日期,同时假设日期文件夹是连贯的(即:每天都有一个文件夹)。初学VB,希望高手指教一下。给个大致的思路和要使用的函数就行,谢谢

#10


dim strFileName as string
'根据日期转换成你的格式
'日(2位数字)+月(3位大写字母)+年(2位数字)

strFileName=你转换后的名字 & ".txt"

open strFileName 就可以了

#11


我的意思是,比如我的日期输入的是:2008-05-01 和 2008-06-30 我要查找的是01MAY08,02MAY08,...31MAY08,01JUN08,02JUN08,...,30JUN08,这样的改怎么做?

#12


我的意思是,比如我的日期输入的是:2008-05-01 和 2008-06-30 我要查找的是01MAY08,02MAY08,...31MAY08,01JUN08,02JUN08,...,30JUN08这61个文件夹以及他们下面所有的文件,这样的改怎么做?

#13




Function FolderCheck(ByVal d1 As Date, ByVal d2 As Date, ByVal FolderName As String) As Boolean
'参数说明:d1起始日期,d2终止日期,FolderName文件夹名称字符串
    
    Dim FolderDate As String
    Dim FolderMonth
    
    If Len(FolderName) <> 7 Then Exit Function
    '获取文件夹名称中的英文月
    FolderMonth = LCase(Mid(FolderName, 3, 3))
    '英文月转换为对应的数字
    FolderMonth = InStr(LCase("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"), FolderMonth)
    FolderMonth = (Val(FolderMonth) + 3) / 4
    '文件夹名称还原为日期
    FolderDate = "20" & Left(FolderName, 2) & "-" & FolderMonth & "-" & Right(FolderName, 2)
    If IsDate(FolderDate) Then
        '如果文件夹是日期,检验日期范围
        If CDate(FolderDate) >= d1 And CDate(FolderDate) <= d2 Then
            FolderCheck = True
        End If
    End If
    
End Function

#14


Option Explicit

Sub Main()
    Dim dtStart As Date
    Dim dtFinish As Date
    Dim dt As Date
    Dim pID As Long
    
    dtStart = CDate("2008-05-01")
    dtFinish = CDate("2008-05-31")
    For dt = dtStart To dtFinish
        pID = Shell("cmd.exe /c Find /C ""aaa"" D:\DATA\" & Format(dt, "ddMMMyy") & "\*.txt > D:\DATA\FIND.txt")
        
        '用 http://blog.csdn.net/jyh_jack/archive/2008/06/16/2552463.aspx 的方法等待结束
        
        'D:\DATA\FIND.txt 中注明了每个 txt 包含 "aaa" 的次数,解析这个文件就可以了
    Next
End Sub

#15


顶老鸟

#16


Private Sub Command1_Click()
    Dim strTemp As String
    Dim intFileNo As Integer
    Dim strPath As String
    
    Dim strDateFrom As String
    Dim strDateTo As String
    Dim lngDatehCnt As Long
    
    Dim strResult() As String
    Dim lngTotalCnt As Long
    
    strPath = "C:\TXT\"
    
    strDateFrom = Text1.Text
    strDateTo = Text2.Text
    
    lngDatehCnt = DateDiff("d", CDate(strDateFrom), CDate(strDateTo))
    
    For LngLoop = 0 To lngDatehCnt - 1
    
        strPath = strPath & Format(Day(DateAdd("d", LngLoop, CDate(strDateFrom))), "00")
        strPath = strPath & Left(MonthName(Month(DateAdd("d", LngLoop, CDate(strDateFrom)))), 3)
        strPath = strPath & Right(Year((DateAdd("d", LngLoop, CDate(strDateFrom)))), 2)
        strPath = strPath & ".txt"
        
        intFileNo = FreeFile
        Open strPath For Input As intFileNo
        strTemp = StrConv(InputB(LOF(1), intFileNo), vbUnicode)
        Close intFileNo
        
        strResult = Split(strTemp, "aaa")
        lngTotalCnt = lngTotalCnt + (UBound(strResult) - 1)
    Next
    
    
    MsgBox lngTotalCnt
    
End Sub

#17


循环当前的文件夹,到里面判断扩展名为.txt的文件,再读取文件内的信息!

#18


吃饭了没事,我也来凑一个热闹:



'文件夹检测
Function FolderCheck(ByVal d1 As Date, ByVal d2 As Date, ByVal FolderName As String) As Boolean
'参数说明:d1起始日期,d2终止日期,FolderName文件夹名称字符串
    
    Dim FolderDate As String
    If Len(FolderName) <> 7 Then Exit Function
    FolderDate = "20" & Right(FolderName, 2) & "-" & Mid(FolderName, 3, 3) & "-" & Left(FolderName, 2)
    FolderDate = Format(FolderDate, "yyyy-mmm-dd")
    'Debug.Print FolderDate
    If IsDate(FolderDate) Then
        '如果文件夹是日期,检验日期范围
        If CDate(FolderDate) >= d1 And CDate(FolderDate) <= d2 Then
            FolderCheck = True
        End If
    End If
    
End Function

'读取文件信息,返回sFind出现的次数
Function GetFileInfo(ByVal FileName As String, sFind As String) As Long
    Dim h As Long
    Dim tmp As String
    h = FreeFile()
    Open FileName For Binary As h
        tmp = Space(LOF(h))
        Get #h, , tmp
    Close
    GetFileInfo = UBound(Split(tmp, sFind))
End Function

'输出结果
Sub PrintValues(ByVal sFind As String, ByVal bDate As Date, ByVal eDate As Date)

    Dim FolderPath As String, FolderName As String
    Dim FilePath As String, FileName As String
    Dim FolderInfo As Long
    Dim FileInfo As Long
    Dim ColInfo As Long
    Dim col As Collection
    Dim i As Long
    
    '搜索符合条件的文件夹,并加入集合中
    Set col = New Collection
    FolderPath = App.Path & "\DATA\"
    FolderName = Dir(FolderPath, vbDirectory)
    Do While FolderName <> ""
        If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
            If FolderCheck(bDate, eDate, Trim(FolderName)) Then
                col.Add FolderName
            End If
        End If
        FolderName = Dir
    Loop
    
    '循环集合,读取文件夹下的txt文件
    For i = 1 To col.Count
        FilePath = FolderPath & col(i) & "\"
        FileName = Dir(FilePath & "*.txt")
        FolderInfo = 0
        Do While FileName <> ""
            '当前txt文件中出现sFind的次数
            FileInfo = GetFileInfo(FilePath & FileName, sFind)
            '输出当前txt文件中出现sFind的次数
            Debug.Print FilePath & FileName & ": " & FileInfo
            '统计这个文件下所有txt中出现sFind的总数
            FolderInfo = FolderInfo + FileInfo
            FileName = Dir
        Loop
        '输出这个文件下所有txt中出现sFind的总数
        Debug.Print FilePath & ": " & FolderInfo
        '总数
        ColInfo = ColInfo + FolderInfo
    Next
    '输出总数
    Debug.Print FolderPath & ": " & ColInfo
    
    Set col = Nothing
End Sub

'测试
Private Sub Command1_Click()
    PrintValues "aaa", "2008-7-21", "2008-8-5"
End Sub

#19


多谢楼上的朋友们了 参考各位的提示 已经用自己的方法写出来了 结贴给分 我感觉给我启示大的就多给 少的就少给 谢谢各位的帮忙

#20