Я очень, очень новичок в SAS и читал вопросы о стеке и документации SAS, чтобы написать код для очень конкретной цели. Мне было трудно достичь моей цели и понять SAS по двум причинам: я могу выполнять код только на удаленном сервере, хотя SSH, потому что у меня нет SAS локально (поэтому при каждом изменении мне нужно загрузить файл, выполнить и верните файлы журнала и lst, проверьте наличие ошибок), и большинство вводных тем, которые я прочитал, не сразу применимы к моей задаче (меня интересует только использование SAS для автоматизации определенной процедуры извлечения данных).Ошибка в наборе данных firstobs
Моя цель состоит в том, чтобы:
- чтения определенных линеечки (т.е. идентификатор для запаса) на файл CSV;
- цикл каждого тикера, получая необходимую информацию через определенные макросы.
До сих пор мне удалось прочитать CSV и импортировать эти данные в набор данных. Чтобы проверить, правильно ли работают основы того, что мне нужно, я сделал следующий код. Моя цель состояла в цикле, чтобы присвоить тикер определенной «переменной» currentticker (возможно, не правильному имени для нее) и распечатать ее. В файле csv есть только две строки: «Первая» и «DELL» - в другой.
libname mydir '~/';
data companies;
infile 'sastests/data/tickers.csv' delimiter=',';
input ticker $;
run;
proc sql;
select count(*)
into :OBSCOUNT
from companies;
quit;
proc print data=companies;
var ticker;
run;
%do iter = 1 to &OBSCOUNT;
data currentticker;
set companies (firstobs = iter obs = iter);
run;
proc print data = currentticker;
run;
%end;
Когда я просматриваю файл журнала, я сразу же получаю сообщение об ошибке в опции firstobs набора данных.
Invalid value for the FIRSTOBS option.
Почему это так? Не должно ли оно быть числом, таким образом, действующим как FIRSTOBS?
Благодарим вас за это заранее.
Редактировать 1: Заголовок не было хорошим описанием проблемы.
Редактировать 2: Примеры макросов, которые будут использоваться для одного тикера. Поиск должен быть отправлен с кодом &. lookup будет вызываться, затем getopt и, наконец, export_tab. Этот код не относится к моему авторству, я немного изменил его после того, как он был представлен в качестве образца кода WRDS.
%macro lookup;
data idcodes (keep=secid);
set optionm.secnmd;
where lowcase(ticker) = &ticker;
proc sort data=idcodes nodupkey;
by secid;
proc print data=idcodes;
%mend;
%macro getopt(year);
proc sql;
create table temp as
select a.*
from
optionm.vsurfd&year as a,
idcodes as b
where
a.secid = b.secid;
run;
proc datasets;
append base=work.&outputfile
data=work.temp;
run;
%mend;
%macro export_tab;
proc export data=&outputfile outfile="&outputfile._out.txt" dbms=tab replace;
run;
%mend;
Что вы на самом деле делаете в SAS с этими данными после его чтения? Если вы просто делаете это, SAS - это плохой инструмент для этой цели (perl будет лучше, python, что угодно). Если вы делаете что-то более сложное, скорее всего, есть лучшие способы сделать это, если вы объясните, что вы делаете. – Joe
Конечно, вы можете использовать мой подход с этим набором макросов. В принципе, если набор данных idcodes содержит ВСЕ идентификационные коды всех нужных вам тикеров, остальные из них будут работать нормально. Затем, когда вы делаете экспорт, вы просто меняете экспорт с помощью 'proc export' на запись на этапе ввода данных (как я писал в своем ответе), используя параметр' filevar' и имя тикера в переменной имени файла. dlm = '09'x, если вы хотите разграничить табуляцию. – Joe
Просто помните, что вы написали:% do iter = 1 to & OBSCOUNT; Вы также должны иметь процент перед этим:% do iter = 1% to & OBSCOUNT; – mvherweg