匹配目录中存在的所有文件中的字符串并返回其总计数

时间:2014-04-04 11:38:53

标签: coldfusion coldfusion-7

我需要一种方法来搜索所有文件中没有出现任何特定字符串的情况。例如,所有文件中“ABC”的总发生次数。早些时候,我有一个代码可以一次在单个文件上执行此操作:

    <cffile action="read"
        file="full_Path\file.txt"
        variable="filecontent">
    <cfset charList = "strings to match/search">
    <cfoutput> 
    <cfloop list="#charList#" index="x"> 
        <cfset charCount = val(len(filecontent) - len(replace(filecontent,x,"","all")))/Len(x)> 
        Count of '#htmlEditFormat(x)#' = #charCount#<br> 
    </cfloop>
    </cfoutput>

我对这个问题有了一些新的要求。 我需要以表格格式获取结果,以便我可以将其导出到Excel工作表。 我试过这样做:

<cfquery name="getname" dbtype="query">
Select Name,Size from Files
</cfquery> 
<cfset myArray = ArrayNew(1)>
<cfset myArray1 = ArrayNew(1)>
<cfset myArray2= ArrayNew(1)>
<cfset charList = "list of strings">
<cfloop list="#charList#" index="x"> 
    <cfset stringCounts[x] = 0>
</cfloop>

<cfoutput query="Files">
        <cffile action="read"
            file="#Files.directory#\#Files.name#"
            variable="filecontent">

      <cfloop list="#charList#" index="x">

            <cfset stringCounts[x] = stringCounts[x] + val(len(filecontent) - len(replace(filecontent,x,"","all")))/Len(x)>          

          <cfset ArrayAppend(myArray1, #Files.name#)>
          <cfset ArrayAppend(myArray2, #x#)>
          <cfset ArrayAppend(myArray, #stringCounts[x]#)>           
        </cfloop>
</cfoutput>

<cfset Qryalldata =Querynew("")>
<cfset row1= QueryAddcolumn(Qryalldata,"FileName", myArray1)>
<cfset row2= QueryAddcolumn(Qryalldata,"Counta", myArray)>
<cfset row3= QueryAddcolumn(Qryalldata,"Tags", myArray2)>

<cfquery name="Result" dbtype="Query">
   Select FileName,Tags,Counta from Qryalldata
</cfquery>
<cfdump var="#Result#">

结果就像

FileName     Tags       Counta
File1       CFquery       2
File1       CFIf          1
File1       CFElse        1
File2       CFquery       3
.
.
.

如何格式化此输出,如

Name of File    Size    count of CFQuery    count of CFIF     count of CFElse  etc

1 个答案:

答案 0 :(得分:3)

好的,所以你要做的就是遍历从cfdirectory调用中获得的所有文件。您可能希望构建一些逻辑来仅检查特定的文件类型(或者这可以由cfdirectory中的filter属性覆盖)。

当你计算可能字符串列表的出现时,我们需要为每个字符串设置多个计数器。有各种方法可以将这些信息存储在变量中,我将建议一个结构。因此,如果您正在寻找字符串“foo”和“bar”的计数,我建议您最终得到一个看起来像这样的结构:

{
    'foo' = 100,
    'bar' = 77
}

这就是我如何做到的。我首先用你所搜索的每个字符串填充零结构,然后在循环文件时递增它。我假设您的代码计算搜索条件的实例数量是好的,我没有仔细研究它。

<cfset charList = "foo,bar">
<cfset filetypes = arrayNew(1)>
<cfset arrayAppend(filetypes, "js")>
<cfset arrayAppend(filetypes, "cfm")>

<cfset stringCounts = structNew()>

<cfloop list="#charList#" index="x"> 
    <cfset stringCounts[x] = 0>
</cfloop>

<cfloop index="i" from="1" to="#arrayLen(filetypes)#">
    <cfdirectory
        action="list"
        directory="your directory" 
        name="Files"
        recurse = "yes"
        filter="*.#filetypes[i]#" />         

    <cfloop query="Files">
        <cffile action="read"
            file="#Files.directory#\#Files.name#"
            variable="filecontent">

        <cfloop list="#charList#" index="x"> 
            <cfset stringCounts[x] = stringCounts[x] + val(len(filecontent) - len(replace(filecontent,x,"","all")))/Len(x)> 
            <cfoutput>#Files.directory#\#Files.name# : count of '#htmlEditFormat(x)#' = #stringCounts[x]#<br></cfoutput>
        </cfloop>
    </cfloop>
</cfloop>

<cfloop collection="#stringCounts#" item="x"> 
    <cfoutput>Count of '#htmlEditFormat(x)#' = #stringCounts[x]#<br></cfoutput>
</cfloop>