ColdFusion,试图解析制表符分隔的字符串

时间:2012-02-13 02:13:16

标签: coldfusion

我有一个简短的测试程序来提取由制表符分隔的字符串。输出对我来说没有意义。我们的想法是找到下一个标签位置,并返回上一个和下一个标签之间的值。

我的程序输出如下。 “抢劫”从何而来?

    fred     ted    rob a rob   alex

程序

<cfscript>
   s="fred"&chr(9)&"ted"&chr(9)&"rob"&chr(9)&"alex";

   oldp=0;
   while(oldp<Len(s))
   {
       p=Find(chr(9),s,oldp+1);
       if (p==0)
           break;
       m=Mid(s,oldp+1,p); // oldp is the old tab poit p is the new get string in between
       WriteOutput(m);
       WriteOutput(" ");
       oldp=p;
   }
 </cfscript>

现在,如果我更改程序以在每个字符串后打印出oldp,结果为:

fred => 1 
ted rob a => 6 
rob alex => 10

我希望看到1,5,9,。我不明白为什么ted rob是第二个字符串。我希望看到rob

1 个答案:

答案 0 :(得分:6)

Mid(s,oldp+1,p);

要回答您的问题,mid的工作原理并非如此。第三个参数p是要返回的字符数,而不是字符串中的位置。

  mid(s, 6, 3) ; // this would return "Ted"

如果我可以提出建议 - 将字符串视为列表更容易,由制表符分隔。然后用列表函数解析它。

<cfscript>
    str = "red"& chr(9) &"ted"& chr(9) &"rob"& chr(9) &"alex";
    for (i = 1; i <= listLen(str, chr(9)); i++) {
        WriteDump( listGetAt(str, i, chr(9)) );
    }
</cfscript>

注意,大多数列表函数都忽略空元素。如果您希望保留它们,请使用listToArray

<cfscript>
    str = "red"& chr(9) &"ted"& chr(9) &"rob"& chr(9) &"alex";
    arr = listToArray(str, chr(9), true);
    for (i = 1; i <= arrayLen(arr); i++) {
        WriteDump( arr[i] );
    }
</cfscript>