Причина экспорта Proc не будет использовать двойную трубу, потому что это создает шаг данных, чтобы сделать экспорт, который использует инструкцию file
. Это известное ограничение - со ссылкой на файл справки:
Ограничение: Даже если строка символов или переменная характер принимается только первый символ строки или переменной используется в качестве выходного разделителя. Это отличается от операции INFILE DELIMITER = .
Строка заголовка ||
работает, потому что SAS строит ее как строчную константу, а не использует оператор файла.
Поэтому я не думаю, что вы можете исправить код экспорта proc, но вот быстрый и грязный шаг данных, который преобразует вывод в желаемый формат, при условии, что ваш набор данных не имеет отсутствующих значений и не содержит никаких символы трубы:
/*Export as before to temporary file, using non-printing TAB character as delimiter*/
proc export
data=sashelp.class
outfile="%sysfunc(pathname(work))\temp.txt"
dbms = dlm;
delimiter = '09'x;
run;
/*Replace TAB with double pipe for all rows beyond the 1st*/
data _null_;
infile "%sysfunc(pathname(work))\temp.txt" lrecl = 32767;
file "%sysfunc(pathname(work))\class.txt";
input;
length text $32767;
text = _infile_;
if _n_ > 1 then text = tranwrd(text,'09'x,'||');
put text;
run;
/*View the resulting file in the log*/
data _null_;
infile "%sysfunc(pathname(work))\class.txt";
input;
put _infile_;
run;
Как предложил Джо, вы могли бы в качестве альтернативы написать собственную логику разделителей в динамически генерируемый шаг данных, например,
/*More efficient option - write your own delimiter logic in a data step*/
proc sql noprint;
select name into :VNAMES separated by ','
from sashelp.vcolumn
where libname = "SASHELP" and memname = "CLASS";
quit;
data _null_;
file "%sysfunc(pathname(work))\class.txt";
set sashelp.class;
length text $32767;
text = catx('||',&VNAMES);
put text;
run;
Как и ответ, но у меня есть неприятные данные, полные недостающих и труб. Отсюда двойная труба. – JJFord3
Ок - найдите символ, который не находится в ваших данных (мне очень нравится '' 09'x'), установите это как разделитель в вызове proc proc, затем замените его на '||'. – user667489
Как насчет использования 'DSD'? – Joe