2015-01-12 5 views
0

Я пытаюсь использовать разделитель с двойной трубкой "||" когда я экспортирую файл из SAS в txt. К сожалению, кажется, что это правильно ограничивает строку заголовка и использует единственную версию для данных.Экспорт в текстовый файл в SAS с двойным разделителем

Код:

proc export data=notes3 outfile='/file_location/notes3.txt' 
dbms = dlm; 
delimiter = '||'; 
run; 

Какие результаты в:

ID||VAR1||VAR2 
1|0|STRING1 
2|1|STRING2 
3|1|STRING3 

ответ

4

Если вы хотите использовать разделитель два символа, вам нужно использовать dlmstr вместо dlm в file заявлении в создании шаг файла данных. К сожалению, вы не можете использовать proc export, так как это не поддерживает dlmstr.

Вы можете создать свой собственный proc export довольно легко, используя dictionary.columns или sashelp.vcolumn, чтобы построить заявление put. Не стесняйтесь задавать более конкретные вопросы на этой стороне, если вам нужна помощь в этом, но ищите информацию для вывода данных, и вы, скорее всего, найдете то, что вам нужно.

1

Причина экспорта 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; 
+0

Как и ответ, но у меня есть неприятные данные, полные недостающих и труб. Отсюда двойная труба. – JJFord3

+1

Ок - найдите символ, который не находится в ваших данных (мне очень нравится '' 09'x'), установите это как разделитель в вызове proc proc, затем замените его на '||'. – user667489

+0

Как насчет использования 'DSD'? – Joe

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