Преобразование возвращенных данных CSV в формат поиска / использования в ColdFusion - PullRequest
1 голос
/ 26 марта 2011

У меня есть данные CSV, возвращенные из http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IHAMPSHI46&month=3&day=25&year=2011&format=1, и мне нужно перевести их в формат, в котором я могу выбрать одну из результирующих строк на основе времени в первом столбце.

Было бы лучше преобразовать в struct / array / xml и как лучше всего это сделать?

Ответы [ 4 ]

2 голосов
/ 26 марта 2011

ОК, я выкинул результат, и похоже, что CSV-файл использует теги <br> для обозначения новой строки, поэтому вам нужно будет выполнить собственное преобразование.Вот пример, который использует UDF из cflib :

<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"))#" />
1 голос
/ 26 марта 2011

Проверьте документы на cfhttp . Используйте атрибут name, и вы получите ответ от http-звонка. Затем вы можете сделать запрос запросов на результат.

0 голосов
/ 28 марта 2011

Используя базу данных H2 (www.h2database.com), вы можете использовать очень удобную функцию csvread. http://cfstuff.blogspot.com/2009/06/using-h2-database-in-coldfusion.html

<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#/>
0 голосов
/ 26 марта 2011

Ваш CSV-результат использует
вместо перевода строки. Используйте эту функцию cflib, http://www.cflib.org/udf/CSVToQuery

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...