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