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

Ted*_*tel 0 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>
Run Code Online (Sandbox Code Playgroud)

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

fred => 1 
ted rob a => 6 
rob alex => 10
Run Code Online (Sandbox Code Playgroud)

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

Lei*_*igh 6

Mid(s,oldp+1,p);
Run Code Online (Sandbox Code Playgroud)

要回答你的问题,那不是中旬的工作方式.第三个参数p是要返回的字符数,而不是字符串中的位置.

  mid(s, 6, 3) ; // this would return "Ted"
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

注意,大多数列表函数忽略空元素.如果要保留它们,请使用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>
Run Code Online (Sandbox Code Playgroud)