Я бы рекомендовал использовать другой разделитель в вашем списке. Нечто подобное |
, которое не может быть частью имени файла.
%let list =cat and dogs|monkeys|humans;
... %sysfunc(countw(&list,|)) ...
... %scan(&list,&i,|) ...
Другая проблема заключается в том, что вам необходимо убедиться, что вы генерируете правильные имена наборов данных SAS. Может быть, лучше использовать номер в имени набора данных и использовать строку как часть метки.
out=csvfile&i (label="&fnames")
Проблема обоих ваших примеров в том, что вы говорите функции %scan()
(и функции countw()
) использовать их набор символов по умолчанию. Которые в системах ASCII представляют собой следующие символы:
blank ! $ % & ( ) * + , - . / ; < ^ ¦
Итак, в вашем первом примере единственными разделителями в вашей строке являются пробелы, поэтому слова в вашей строке:
"cat
and
dogs"
"monkeys"
"humans"
Обратите внимание, что кавычки являются частью слов, которые %scan()
находит, поскольку они не являются разделителями. Таким образом, даже такие значения, как "humans"
, не будут работать, поскольку вы пытаетесь использовать их из-за дополнительного символа кавычек, который они включают. А разбиение "cat and dogs"
на три слова добавляет дополнительную проблему несбалансированных кавычек.
В вашем втором у вас также есть три других символа, (,)
, которые будут рассматриваться как разделители, поэтому слова:
humans
cats
and
dogs
Если вы действительно хотите обработать список строк в кавычках, разделенных пробелами, то скажите %scan()
, чтобы использовать пробел в качестве разделителя, и добавьте модификатор q
, чтобы разрешить строки в кавычках. Возможно, вы также захотите использовать функцию dequote()
для удаления кавычек вокруг значений.
Попробуйте эту тестовую программу, чтобы узнать, как это сделать.
%macro test(list);
%local i word ;
%do i=1 %to %sysfunc(countw(&list,%str( ),q));
%let word=%sysfunc(dequote(%qscan(&list,&i,%str( ),q)));
%put i=&i word=&word;
%end;
%mend test;
%test("cat and dogs" "monkeys" "humans")