使用 ColdFusion 在多个 CSV 文件中分离查询?
Separating Query in multiple CSV Files Using ColdFusion?
我想做的是
一个用户输入了一个日期
他们按下下载按钮,这将运行一个查询,生成他们输入日期的结果。在执行此操作时,它会将这些文件以 .CSV 格式写入我的服务器。我将最终压缩它们,文件将开始以 zip 格式下载。
我有代码可以将查询写入我们的服务器,但我的问题是它将所有内容放入一个大文件中,我希望将结果分成每个文件 2000 个结果。这可能吗?如果是这样,我该怎么做?
我的当前代码用于查询和将数据写入服务器。调整了一些东西。
<cfquery name="users" datasource="#request.db#">
SELECT DISTINCT firstname
FROM Users
WHERE Users.Date=#Date#
</cfquery>
<cfset filePath="D:/Users/Users.csv">
<cfset content = "firstname">
<cffile
action="write"
file="#filePath#"
output="#content#">
<cfoutput query="users">
<cfset content = "">
<cfset content = "#firstname#">
<cffile
action="append"
file="#filePath#"
output="#content#">
</cfoutput>
<cfheader name="Content-Disposition" value="attachment; filename=#getFileFromPath (filePath)#">
<cfcontent file="#filePath#" type="application/octet-stream" deletefile="yes">
此代码将运行查询,将文件写入服务器并自动下载。但只下载并写入一个文件。如何将其分成多个小结果文件?
你想做这样的事情吗?
<cfloop from="1" to="#users.recordcount#" step="2000" index="section">
<cfoutput query="users" startrow="#section#" maxrows="2000">
<cfset content = "#firstname#">
<cffile
action="append"
file="#filePath##section#.csv"
output="#content#">
</cfoutput>
</cfloop>
...
然后压缩生成的文件
<cfset maxrows = 2000>
<cfset onrow = 1>
<cfset filen = 1>
<cfset filelist = "">
<cfloop condition="#onrow# lte #users.recordcount#">
<cfsavecontent variable="MakeContents"><cfoutput query="users" startrow="#onrow#" maxrows="#maxrows#">#firstname#
</cfoutput></cfsavecontent>
<cfset MakeContents = trim(MakeContents)><!--- trimming gets rid of an extraneous return at the end of makecontents --->
<cfset filepath = "d:\users\users_#filen#.csv">
<cfset onrow = onrow + maxrows>
<cfset filelist = listAppend(filelist,"users_#filen#.csv")>
<cffile...> <!---write MakeContents to a file--->
<cfset filen = filen + 1>
</cfloop>
<cfzip...>
<cfloop list="#filen#" index="fi">
<cfzipparam source="d:\users\#fi#">
</cfloop>
</cfzip>
这会将结果集的所有内容放入变量中,将变量写入文件并将文件存储在列表中。
所有文件创建完成后,cfzip 通过遍历列表获取所有文件。
您可以为文件名添加一个唯一标识符并保留它们,也可以之后删除它们。
我想做的是
一个用户输入了一个日期 他们按下下载按钮,这将运行一个查询,生成他们输入日期的结果。在执行此操作时,它会将这些文件以 .CSV 格式写入我的服务器。我将最终压缩它们,文件将开始以 zip 格式下载。
我有代码可以将查询写入我们的服务器,但我的问题是它将所有内容放入一个大文件中,我希望将结果分成每个文件 2000 个结果。这可能吗?如果是这样,我该怎么做?
我的当前代码用于查询和将数据写入服务器。调整了一些东西。
<cfquery name="users" datasource="#request.db#">
SELECT DISTINCT firstname
FROM Users
WHERE Users.Date=#Date#
</cfquery>
<cfset filePath="D:/Users/Users.csv">
<cfset content = "firstname">
<cffile
action="write"
file="#filePath#"
output="#content#">
<cfoutput query="users">
<cfset content = "">
<cfset content = "#firstname#">
<cffile
action="append"
file="#filePath#"
output="#content#">
</cfoutput>
<cfheader name="Content-Disposition" value="attachment; filename=#getFileFromPath (filePath)#">
<cfcontent file="#filePath#" type="application/octet-stream" deletefile="yes">
此代码将运行查询,将文件写入服务器并自动下载。但只下载并写入一个文件。如何将其分成多个小结果文件?
你想做这样的事情吗?
<cfloop from="1" to="#users.recordcount#" step="2000" index="section">
<cfoutput query="users" startrow="#section#" maxrows="2000">
<cfset content = "#firstname#">
<cffile
action="append"
file="#filePath##section#.csv"
output="#content#">
</cfoutput>
</cfloop>
...
然后压缩生成的文件
<cfset maxrows = 2000>
<cfset onrow = 1>
<cfset filen = 1>
<cfset filelist = "">
<cfloop condition="#onrow# lte #users.recordcount#">
<cfsavecontent variable="MakeContents"><cfoutput query="users" startrow="#onrow#" maxrows="#maxrows#">#firstname#
</cfoutput></cfsavecontent>
<cfset MakeContents = trim(MakeContents)><!--- trimming gets rid of an extraneous return at the end of makecontents --->
<cfset filepath = "d:\users\users_#filen#.csv">
<cfset onrow = onrow + maxrows>
<cfset filelist = listAppend(filelist,"users_#filen#.csv")>
<cffile...> <!---write MakeContents to a file--->
<cfset filen = filen + 1>
</cfloop>
<cfzip...>
<cfloop list="#filen#" index="fi">
<cfzipparam source="d:\users\#fi#">
</cfloop>
</cfzip>
这会将结果集的所有内容放入变量中,将变量写入文件并将文件存储在列表中。
所有文件创建完成后,cfzip 通过遍历列表获取所有文件。
您可以为文件名添加一个唯一标识符并保留它们,也可以之后删除它们。