2015-06-09 1 views
0

Я новичок в SAS и вращаю свои колеса. Документация SAS и другие поисковые запросы Google не помогли мне понять это. Как я могу объявить глобальную переменную массива, которую я могу использовать в разных процедурах для циклического прохождения содержимого?Как объявить глобальную переменную массива в SAS?

Вот что я пробовал:

%let fileArray = array{*} $32 file1-file4 ('ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' 'ce_abcdef_filedetail3' 'ce_abcdef_filedetail4'); 

/* Loop through each file and run the macro*/ 
do i = 1 to dim(fileArray); 
    %analyze_file(FILENAME=&fileArray[i], PATH=&path, OUTPUT=&output) 
end; 

мне это нужно, чтобы передать имя файла, что я указать в глобальном массиве. Спасибо за любую помощь!

+0

SAS не поддерживает массивы в макропеременных. Однако есть много способов сделать то, что вы пытаетесь сделать. – Joe

+0

Что вы пытаетесь сделать в файле analysis_file? В зависимости от того, что вы делаете, могут быть более простые способы в целом. – Reeza

ответ

5

Что вы пытаетесь сделать, это в основном использовать подход, основанный на данных, для управления вашими макросами. Повезло тебе! Однако вы не можете сделать это прямо так, как вы пытаетесь. Хотя вы можете использовать массив макросов, как упоминает Yukclam9, есть более простой способ.

SAS не использует массивы так, как r использует векторы или матрицы: SAS использует наборы данных, хотя вы можете делать много одинаковых вещей.

Поместите свои имена файлов в набор данных - возможно, они уже есть в файле excel или что-то еще? Давайте поместим его здесь в datalines, если нет.

data filenames; 
    input filename :$32.; 
    datalines; 
ce_abcdef_filedetail1 
ce_abcdef_filedetail2 
ce_abcdef_filedetail3 
ce_abcdef_filedetail4 
;;;; 
run; 

Теперь вы хотите получить их в макро-вызов. Сладкий, у нас есть много способов сделать это. Это самое быстрое.

proc sql; 
    select cats('%analyze_file(FILENAME=',filename,", PATH=&path, OUTPUT=&output)") 
    into :mcalllist separated by ' ' 
    from filenames; 
quit; 

CATS просто конкатенации и полосы. Я оставляю только &path и &output, поскольку они выглядят как глобальные макропеременные - конечно, если они также являются переменными, вы можете включить их одинаково.

В настоящее время &mcalllist - это глобальная макропеременная, которая хранит ваши четыре макрокоманды (или, как многие из них были в этом наборе данных, по одному в строке)! Вы просто выполните

&mcalllist 

и presto, он называет ваш макрос. Вы также можете использовать call execute или построить файл и %include его сделать то же самое, с некоторыми различными ограничениями. (Например, это может содержать не более 65 тыс. Символов).

+0

Я буду играть с этим и предложением yukclam, чтобы посмотреть, смогу ли я заставить любой метод работать. Я полон, что у SAS нет более простого способа сделать это. Спасибо – Brad

+0

Это очень простой способ сделать это, на мой взгляд - особенно для общего использования (т. Е. У меня есть таблица с перечислением всех магазинов в моей компании, я хочу запустить отчет для каждого из них] - импортировать таблицу и запустить одну строку кода. SAS не делает его особенно легким для этого, используя «глобальные переменные», потому что это не то, как работает SAS, и даже такие языки, как R, вы не должны делать это именно так. Хотя SAS не является языком ООП, в нем много концепций, а «набор данных» - ваш «объект». – Joe

+0

Joe- Я принял ваш ответ - кажется, работает, несмотря на то, что выдает мне сообщение об ошибке: ERROR 180-322: Заявление недействительно или используется из-за правильного порядка. Я не думаю, что мне нравится, как я звоню & mcalllist: данные _null_; \t call execute (& mcalllist); run; – Brad

0

Проверить это информативная статья: Macro Array Statement

Что вы могли бы сделать, чтобы создать массив,

%array (younameit, values = 'ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' ...) 

отметить, что термин «ценность» фиксирована и значение после знака «=» вверх вам

и сделать это с %do_over

%macro read_file(fileArray); 
    %analyze_file(FILENAME=&fileArray, PATH=&path, OUTPUT=&output) 
    %end; 
%mend read_file; 

%do_over(younameit, macro=read_file) 

Результат вызовет макрос read_file ('ce_abcdef_filedetail1'), read_file ('ce_abcdef_filedetail2') и оставшиеся соответственно. Я также предлагаю вам поставить цитату (двойную кавычку для запуска макроса) в оператор, но не с помощью макропеременной.

+0

Хороший ответ, но вам определенно нужно упомянуть тот факт, что массив макросов не является истинным массивом (а не стандартной функцией языка). OP явно неправильно понимает это. – Joe

+0

Кроме того - я думаю, вы не понимаете, как работает '% do_over'. Конечно, вы не можете использовать 'dim' таким образом - это функция шага данных. Пожалуйста, прочитайте документ, с которым вы связались, и исправьте этот раздел. – Joe

+0

соответственно, спасибо – yukclam9