将返回的CSV数据转换为ColdFusion中的可搜索/可用格式

将返回的CSV数据转换为ColdFusion中的可搜索/可用格式,csv,coldfusion,Csv,Coldfusion,我有从返回的CSV数据,需要将其转换为一种格式,在这种格式中,我可以根据第一列中的时间选择一个结果行 转换为struct/array/xml是否更好?实现这一点的最佳方法是什么?查看文档以了解更多信息。使用name属性,您将从http调用返回一个查询。然后您可以对结果执行查询。好的,我转储了结果,看起来CSV文件使用标记表示换行符,因此您必须进行自己的转换。下面是一个使用UDF的示例: 您的CSV结果使用的是而不是换行符。 使用此cflib函数,使用H2数据库www.h2database.com

我有从返回的CSV数据,需要将其转换为一种格式,在这种格式中,我可以根据第一列中的时间选择一个结果行


转换为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 (&#116;&#111;&#110;&#121;&#64;&#98;&#114;&#97;&#110;&#100;&#110;&#101;&#114;&#115;&#46;&#99;&#111;&#109;)
* @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#/>