1

我需要一种方法来搜索所有文件中完全没有出现任何特定字符串。例如,所有文件中出现“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
4

1 回答 1

3

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

当您计算可能字符串列表的出现次数时,我们需要为每个字符串设置多个计数器。有多种方法可以将该信息存储在变量中,我将建议一个结构。因此,如果您正在寻找字符串“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>
于 2014-04-04T13:35:32.783 回答