Как модификатор «k» в FINDC() работает в SAS?

Я читаю книгу «Функции SAS на примере — второе издание», и у меня возникают проблемы с пониманием определенной функции из-за примера и вывода, который они получают.

Функция: FINDC
Назначение: Найти символ, который появляется или не появляется в строке. С помощью необязательных аргументов вы можете определить начальную точку поиска, задать направление поиска, игнорировать регистр или конечные пробелы или искать символы, кроме перечисленных.

Синтаксис: FINDC(character-value, find-characters <,'modifiers'> <,start>)

Два модификатора — i и k:

i игнорировать регистр
k учитывать только символы, которых нет в списке найти символы

Итак, теперь один из примеров имеет это:

Примечание: STRING1 = «Яблоки и книги».

FINDC(STRING1,"aple",'ki')

Для вывода они сказали, что он возвращает 1, потому что позиция «A» в Apple. Однако именно это меня смущает, потому что я думал, что модификатор k говорит искать символы, которых нет в списке символов поиска. Так почему же он ищет a, когда буква "A" без учета регистра есть в списке поисковых символов. Мне кажется, что этот пример должен выводить 6 вместо "s" в яблоках.

Кто-нибудь может помочь мне лучше объяснить модификатор k и почему вывод для этого ответа 1 вместо 6?

Изменить 1

Чтение документации SAS в Интернете я нашел этот пример, который, кажется, противоречит книге, которую я читаю:

Пример 3. Поиск символов и использование модификатора K
В этом примере выполняется поиск строки символов и возвращаются символы, которых нет в списке символов.

data _null_;
   string = 'Hi, ho!';
   charlist = 'hi';
   j = 0;
   do until (j = 0);
      j = findc(string, charlist, "k", j+1);
      if j = 0 then put +3 "That's all";
      else do;
         c = substr(string, j, 1);
         put +3 j= c=;
      end;
   end;
run;

SAS writes the following output to the log: 
   j=1 c=H
   j=3 c=,
   j=4 c= 
   j=6 c=o
   j=7 c=!
   That's all

Значит, книга неправильная?


person amallard    schedule 27.07.2017    source источник
comment
Это один из тех случаев, когда внутренняя согласованность заканчивается тем, что не имеет особого смысла. k делает это, потому что он впервые появился в compress, где он говорит сжимать вместо удаления символов в [списке], он должен keep их. Нет никакого смысла в том, чтобы здесь было k, но так как это уже означает это в compress, и это гарантирует, что у нас не будет других коллизий...   -  person Joe    schedule 27.07.2017


Ответы (1)


Книга неправильная.

511  data _null_;
512    STRING1 = "Apples and Books" ;
513    x=FINDC(STRING1,"aple",'ki');
514    put x=;
515    if x then do;
516      ch=char(string1,x);
517      put ch=;
518    end;
519  run;

x=6
ch=s
person Tom    schedule 27.07.2017