未找到带空格的CFCase值

时间:2018-03-12 20:48:31

标签: coldfusion html-parsing case coldfusion-8

任何人都有这个问题,从html文件解析设置<cfcase>值的值包含空格?如果值包含空格,ColdFusion无法在解析的html文件中找到数据匹配。

例如:

<CFCASE value="LGT RAIN">
<CFSET application.condition="Lt Rain">
</CFCASE>`

html文件的值为&#34; LGT RAIN&#34;,但由于其被解析的方式,它没有定义城市的条件。有没有像在运行switch语句之前检查条件一样的工作?就像是&#34; LGT RAIN&#34;找到然后将cfset值设置为&#34; LGTRAIN&#34;。

以下是我要解析的示例link

https://forecast.weather.gov/product.php?site=CAE&issuedby=CAE&product=RWR&format=CI&version=1

<CFSET WeatherData = CFHTTP.FileContent>

代码:

<!--- Check For Condition with Two Word Phrase ---------------> 
<CFSET condition= #GetToken("#content#",#attributes.citystring# + 1, " ")#>
<br> 
<CFSET city = #attributes.citystring#> 
<CFIF (condition is "LGT") 
   or (condition is "HVY") 
   or (condition is "FRZ") 
   or (condition is "MIX") 
   or (condition is "NOT")> 
  <CFSET condition= ( 
    #GetToken("#content#",#attributes.citystring# + 1, " ")# 
    & " " & 
    #GetToken("#content#",#attributes.citystring# + 2, " ")#
  )>
  <br>
  <CFSET Temp = #GetToken("#content#",#attributes.citystring# + 3, " ")#>'
  .......

2 个答案:

答案 0 :(得分:2)

关于你最终会如何处理你所得到的天气,有很多缺失的背景,所以我做了一些关于解决天气预测的方法的假设。

您必须实际解析页面以获取该实际块,但是一旦您这样做,您可以使用我的建议将这些天气元素拆分出来。我摆脱了getToken()调用,因为我认为这可能比你需要的工作更多,并且基本上导致了空格问题。我的代码仍然比我想象的要多,但我试图确保我没有使用CF8之上的任何东西。我认为它应该全部工作,但我没有CF8服务器可以测试。

https://trycf.com/gist/1993243eb476a629ec25f8c6e8ddff3c/acf?theme=monokai

我在代码中包含了一些注意事项。

<!--- Create a block of the parsed weather. --->
<cfsavecontent variable="myWX">ANDERSON       FAIR      49  16  26 W12G20    30.01F
LIBERTY        FAIR      49  14  24 W12G21    29.99F
SPARTANBURG    FAIR      45   9  23 NW12G21   30.00F
CLEMSON        FAIR      48  10  21 NW13G22   30.02F
GREENVILLE     FAIR      48  13  24 VRB3      29.99F
GREENWOOD      FAIR      49  13  23 W10G21    30.03F
GREER          FAIR      48   9  20 VRB7      29.99F
ROCK HILL      FAIR      46  17  31 NW10G22   29.99F
CHESTER        FAIR      45  12  26 W12G17    30.01F
LAURENS        FAIR      48  16  27 NW12G18   30.01F
</cfsavecontent>

 <!--- end of line character (this may change if your feed uses other eol)--->
<cfset crlf = chr(13)&chr(10)>

<!--- Make weather an array of strings for each city. --->
<cfset wxArray = ListToArray(myWX, crlf, false, true)> 

我的建议是将不同的元素放在一个结构中,然后使用它。 1排城市天气= 1排结构。

我的代码假定您正在从HTML中解析65个字符的固定宽度记录的行,这是您在获取各个行时的样子。

<!--- Loop through the new weather array and make a new array of parsed weather. --->
<!--- Create initial weather array for output. --->
<cfset newWXArray = []> 
<cfloop array="#wxArray#" index="wxRow">
    <!--- NOTE: Yay go CF8s implicit struct creation! --->
    <cfset WXRow = {
        city = trim(mid(wxRow,1,15)) , <!--- trim() will remove leading/trailing spaces --->
        sky  = trim(mid(wxRow,16,10)) ,
        tmp  = trim(mid(wxRow,26,4)) ,
        dp   = trim(mid(wxRow,30,4)) ,
        rh   = trim(mid(wxRow,34,3)) ,
        wind = trim(mid(wxRow,37,10)) ,
        pres = trim(mid(wxRow,47,6)) , 
        rmks = trim(mid(wxRow,53,11))
    }>
    <!--- ArrayAppend() returns true/false, so this variable isn't used. --->
    <cfset throwaway = ArrayAppend(newWXArray, WXRow)>
</cfloop>

<cfdump var="#newWXArray#">

现在你有一个包含所有城市的阵列,可以为你需要的城市拉出各个部分。

What's the weather like in Liberty? <br>

<cfset whichRow = 0> 
<cfloop from="1" to="#arrayLen(newWXArray)#" index="i"> 
    <cfif newWXArray[i].CITY IS "LIBERTY"> 
        <cfset whichRow = i> 
    </cfif> 
</cfloop> 

<cfoutput>
City >> #newWXArray[whichRow].CITY# <br>
Sky >> #newWXArray[whichRow].SKY# <br>
Temp >> #newWXArray[whichRow].TMP# <br>
DewPoint >> #newWXArray[whichRow].DP# <br>
Relative Humidity >> #newWXArray[whichRow].RH# <br>
Wind >> #newWXArray[whichRow].WIND# <br>
Pressure >> #newWXArray[whichRow].PRES# <br>
Remarks >> #newWXArray[whichRow].RMKS# <br>
</cfoutput>

最后注意事项:

我忘记了CF8的限制。如果能够升级到当前版本的ACF或Lucee,可以使用很多东西来简化 MUCH

此外,正如我所建议的,更改链接以提取纯文本版本(https://forecast.weather.gov/product.php?site=CAE&issuedby=CAE&product=RWR&format=txt&version=1&glossary=1)将显着减少您必须解析的文本量。

答案 1 :(得分:1)

我在文本数据中弄乱条件逻辑的空白区域的经验一直是尾随空格,但原则是相同的。如有疑问,请查看您的数据。这是一个简单的例子:

MyVar = 'Lgt  Rain';  // two spaces between the words
if (MyVar == 'Lgt Rain'){ // one space between words
applicable code
}
else {
writeoutput(replace(MyVar, ' ', '-space-', 'all'));
}