ColdFusion, Попытка разобрать строку с разделителями табуляции - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть короткая тестовая программа для извлечения строк, разделенных вкладками Вывод не имеет смысла для меня. Идея состоит в том, чтобы найти следующую позицию вкладки и вернуть значения между предыдущей и следующей вкладками.

Вывод моей программы ниже. Откуда взялся «грабитель»?

    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 Ответ

6 голосов
/ 13 февраля 2012
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>
...