将返回的CSV数据转换为ColdFusion中的可搜索/可用格式
我有从返回的CSV数据,需要将其转换为一种格式,在这种格式中,我可以根据第一列中的时间选择一个结果行将返回的CSV数据转换为ColdFusion中的可搜索/可用格式,csv,coldfusion,Csv,Coldfusion,我有从返回的CSV数据,需要将其转换为一种格式,在这种格式中,我可以根据第一列中的时间选择一个结果行 转换为struct/array/xml是否更好?实现这一点的最佳方法是什么?查看文档以了解更多信息。使用name属性,您将从http调用返回一个查询。然后您可以对结果执行查询。好的,我转储了结果,看起来CSV文件使用标记表示换行符,因此您必须进行自己的转换。下面是一个使用UDF的示例: 您的CSV结果使用的是而不是换行符。 使用此cflib函数,使用H2数据库www.h2database.com
转换为struct/array/xml是否更好?实现这一点的最佳方法是什么?查看文档以了解更多信息。使用name属性,您将从http调用返回一个查询。然后您可以对结果执行查询。好的,我转储了结果,看起来CSV文件使用标记表示换行符,因此您必须进行自己的转换。下面是一个使用UDF的示例:
您的CSV结果使用的是
而不是换行符。
使用此cflib函数,使用H2数据库www.h2database.com您可以使用随时可用的csvread函数。
谢谢托德。但是,这样做会抛出一个错误,说明列名SoftwareType无效。SoftwareType是数据中的最后一列。有什么想法吗?谢谢,在发表我的评论后,我看到了你的帖子。“这太完美了!”保罗-我注意到你的数据中有空元素,即,,。要保留这些内容,可以使用listToArray的第三个参数:listToArraylist、delim、includeEmptyElements感谢Todd。顺便说一句,我正在做一个噩梦,使用Q中的Q。有什么原因导致下面的方法不起作用吗?从右位选择[Time]、TemperatureC、WindPeedKmh,其中时间介于“DateFormatDayed,YYYY-MM-DD timeFormatdateAddh,-1,DateDayed,HH:MM:00”和“DateFormatDayed,YYYY-MM-DD timeFormatdateAddh,1,DateDayed,HH:MM:00'昨天试图仅选择当前时间的结果-+1小时,收到以下错误:查询语法错误。遇到时间。条件表达式不正确,应为[like | null | between | in | comparison]条件之一,where子句中的@Paul'time'应为[time]
<cfscript>
/**
* Transform a CSV formatted string with header column into a query object.
*
* @param cvsString CVS Data. (Required)
* @param rowDelim Row delimiter. Defaults to CHR(10). (Optional)
* @param colDelim Column delimiter. Defaults to a comma. (Optional)
* @return Returns a query.
* @author Tony Brandner (tony@brandners.com)
* @version 1, September 30, 2005
*/
function csvToQuery(csvString){
var rowDelim = chr(10);
var colDelim = ",";
var numCols = 1;
var newQuery = QueryNew("");
var arrayCol = ArrayNew(1);
var i = 1;
var j = 1;
csvString = trim(csvString);
if(arrayLen(arguments) GE 2) rowDelim = arguments[2];
if(arrayLen(arguments) GE 3) colDelim = arguments[3];
arrayCol = listToArray(listFirst(csvString,rowDelim),colDelim);
for(i=1; i le arrayLen(arrayCol); i=i+1) queryAddColumn(newQuery, arrayCol[i], ArrayNew(1));
for(i=2; i le listLen(csvString,rowDelim); i=i+1) {
queryAddRow(newQuery);
for(j=1; j le arrayLen(arrayCol); j=j+1) {
if(listLen(listGetAt(csvString,i,rowDelim),colDelim) ge j) {
querySetCell(newQuery, arrayCol[j],listGetAt(listGetAt(csvString,i,rowDelim),j,colDelim), i-1);
}
}
}
return newQuery;
}
</cfscript>
<cfset u = "http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IHAMPSHI46&month=3&day=25&year=2011&format=1" />
<cfhttp url="#u#" result="csv" />
<!--- if you dump the result you can see that the result contains <br> tags to indicate new lines --->
<!---
<cfdump var="#csv.fileContent#" />
--->
<cfdump var="#csvToQuery(replace(csv.fileContent, "<br>", "", "all"))#" />
<cfset u="http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IHAMPSHI46&month=3&day=27&year=2011&format=1"/>
<cfhttp url="#u#" result="csv" />
<cffile
action="write"
file="#ExpandPath('./w3.csv')#"
output="#rereplace(csv.fileContent, "<br>|<!--.*-->", "", "all")#" />
<cfquery name="w2" datasource="h3">
select * from csvread('#ExpandPath('./w3.csv')#')
</cfquery>
<cfdump var=#w2# expand="no"/>
<cfset yesterday = dateadd("d",-1,now())/>
<cfquery name="w2" datasource="h3">
SELECT Time, TemperatureF, WindSpeedMPH FROM csvread('#ExpandPath('./w3.csv')#')
WHERE Time BETWEEN '#dateFormat(yesterday, "YYYY-MM-DD")# #timeFormat(dateAdd("h", -1, yesterday), "HH:MM")#:00' AND '#dateFormat(yesterday, "YYYY-MM-DD")# #timeFormat(dateAdd("h", 1, yesterday), "HH:MM")#:00'
</cfquery>
<cfdump var=#w2#/>