2015-07-01 2 views
0

Я использую студию sas DI, и я пытаюсь получить значение даты, записанное внутри имени входного файла, чтобы поставить ту же дату и в имя выходного файла. Поэтому сначала мне нужно получить имя файла и вынуть дату, а затем вернуть дату. Какой самый простой подход?Получение имени файла в переменной

ответ

0

Лучший способ автоматизировать ваш код SAS приносит информацию о дате из системы, как:

data _null_; 
    call symput("PERDATE", Compress(put(intnx('month',date(),-1,'end'), YYMMDDn8.))); 
run; 

От линии выше вы получаете Perdate Макропеременная в формате ГГГГММДД за предыдущий месяц (-1). Тогда вы можете вычесть из этой переменной, как хотите.

%let ayear = %Substr(&PERDATE,1,4); /* ayear is the year in YYYY format */ 
%let amonth = %Substr(&PERDATE,5,2); /* amonth is the month in MM format */ 
%let aday = %Substr(&PERDATE,7,2); /* aday is the day in DD format */ 
%let adate=&ayear&amonth;   /* adate is if you want in format YYYYMM */ 
%put &ayear&amonth; 
%put &amonth; 
%put &perdate; 

Затем вы можете прочитать входной файл ежедневно или ежемесячно автоматически без изменения названия входного и выходного файла. Например, если вы получаете продаж отчет ежемесячно в формате, как Sales_YYYYMM то вы можете просто написать в коде, как:

infile sales_&ayear.&amonth.; /* Put Dot after each Macro statement */ 

Sales_&ayear.&amonth. даст вам Sales_201506. Вы можете описать свой выходной файл в той же материи, как Out=result_&ayear.&amonth.;

data result_&ayear.&amonth.; 
    set Sales_&ayear.&amonth.; 
run; 

Если вы не получаете ваш файл регулярно, если вам необходимо ввести дату вручную, то вы можете просто написать создать макропеременную для дата в начале вашего кода, то вы всегда использовать эту переменную макрокоманды в коде:

%let mydate=201506; 
%put &mydate; 

Таким образом, в каждом цикле, вы просто изменить переменную mydate в Yoru коде. Вам не нужно ничего менять ...

+0

Проблема заключается в том, что я хочу получить дату из метаданных файла в sas DI ... i.e. когда часть даты изменяется для входного файла, имя выходного файла будет соответствующим образом изменяться, а также не нужно будет перенастраивать задание. –

0

Трюк настроен для метаданных ВНЕШНЕГО ФАЙЛА для ввода и вывода файла правильно. Вот как это сделать. Попробуйте создать метаданные EXTERNAL FILE с использованием уже существующего файла, чтобы метаданные столбцов были правильно созданы с использованием формата и informat. После создания метаданных EXTERNAL FILE отредактируйте метаданные EXTERNAL FILE, щелкнув правой кнопкой мыши метаданные FILE и перейдите в Properties -> Location File Location. В разделе имени файла вместо уже существующего файла заменить часть даты на макро переменную. Например, если имя файла: c: \ Sushil_20150701.txt введите c: \ Sushil_ mydatevar..txt. Также в разделе «НАЗВАНИЕ ФАЙЛА» выберите «Двойные кавычки вокруг имени файла»

То же самое касается выходного файла. Поскольку мы собираемся использовать макрокоманду mydatevar на имя входного файла в имени выходного файла, вы можете поместить mydatevar так же, как это было сделано выше.

После того, как все это сделано, мы хорошо используем метаданные файлов с помощью File Reader и File Writer для чтения и записи файлов соответственно.

Надеюсь, это поможет!

+0

Часть записи файла должна быть точно такой, как вы сказали, без сомнения. Но как насчет имени входного файла? Я имею в виду, как установить значение даты ввода из метаданных файла? (Предположим, что имя файла: c: \ Sushil_20110728 ..txt) –

+0

ну, вы можете добавить свою логику в раздел предварительного кода свойств потока задания, если вы хотите, чтобы значение даты в макропеременной было доступно для другого преобразования. Таким образом, согласно моему ответу, следующее имя файла: c: \ Sushil_ & mydatevar..txt и макрода переменная mydatevar могут быть добавлены в предварительном коде, например. % let mydatevar = 20110728; , Если все не так просто и логика должна быть введена, чтобы получить дату ввода, мы можем закодировать логику в самой секции предварительного кода, чтобы установить значение для mydatevar. – sushil

+0

да и для этого какой должен быть код? –

Смежные вопросы