2015-11-04 1 views
4

Я привязываю для преобразования текстового файла с разделителями-запятыми в файл с разделителями каналов, но мое имя входного файла (файл с разделителями-запятыми) является переменной (flname1). Я использую код, предложенный элементом stackoverflow. Код работает отлично, пока я указать имя файла в входной_файл заявление, но я не знаю, как указать имя файла, с переменнойЗадание имени файла как переменной в инструкции infile

data _null_; 
    enddate=date(); 
    flname1=compress("d:\temp\wq_" || year(enddate) || put(month(enddate),z2.) || ".txt"); 
    length x1-x6 $200; 
    infile 'flname1' dsd dlm=',' truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

Я новичок в SAS и любая помощь будет принята с благодарностью , Спасибо!

+0

Вы пробовали опцию 'filevar' в инструкции infile? https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000146932.htm – Reeza

+2

Немного оффтопик, но чтобы сделать вашу жизнь проще, вы также должны изучить использование ' cat() 'для выполнения конкатенаций. Есть несколько из них - 'catt() cats() cat() catx()'. Они обеспечивают некоторые улучшения качества жизни, такие как преобразование типов преобразования между цифровыми и символами, обрезка и добавление разделителей, чтобы назвать несколько. Использование двухтрубной нотации '||' теперь устарело, но распространено многими старыми документами и учебными материалами. Это также устранит необходимость в этом 'compress()' statement. –

+0

Что такое создание файла с разделителями каналов? –

ответ

0

Возможно, вы хотите сделать это как макро переменную - это не нормальное использование filevar (которое вы бы использовали, если у вас был набор данных с кучей имен файлов в нем или что-то в этом роде).

%let filename = d:\temp\wq_%sysfunc(today(),YYMMN6.).txt; 
%put &=filename; 

data _null_; 
    length x1-x6 $200; 
    infile "&filename." dsd dlm=',' truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

Макропеременные только текст замены, так что они могут быть использованы везде, где вы могли бы ввести то же самое в них также не нужно конкатенации функции -. Больше, чем нужно сцепить при вводе слова в - так что это проще сделать.

Здесь я использую %sysfunc сказать SAS выполнить функцию сегодня(), а второй аргумент указывает, что его формат - YYMMN6. формат вы посмотрите, как вы хотите (201506 или аналогичный). Затем просто убедитесь, что используют " цитаты, а не ' кавычки, так как последний не разрешает макропеременной.

+0

@ Joe-Спасибо. Это сработало! – asmi

2

Вы должны быть в состоянии использовать опцию filevar в infile заявлении, например:

data _null_; 
    enddate=date(); 
    flname1=compress("d:\temp\wq_"||year(enddate)||put(month(enddate),z2.)||".txt"); 
    length x1-x6 $200; 
    infile myinputfile dsd dlm=',' filevar=flname1 truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

documentation объясняет больше о возможности и есть пример его использования в примере 5.

С уважением , Амир.