我试图使用双管分隔符" ||"当我将文件从SAS导出到txt时。不幸的是,它似乎只是正确地划分标题行并使用单一版本的数据。
代码是:
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
答案 0 :(得分:4)
如果要使用双字符分隔符,则需要在数据步骤文件创建中的dlmstr
语句中使用dlm
而不是file
。不幸的是,您不能使用proc export
,因为它不支持dlmstr
。
您可以使用proc export
或dictionary.columns
构建sashelp.vcolumn
语句,轻松地创建自己的put
。如果您需要帮助,请随意询问有关该方面的更具体问题,但要搜索数据驱动输出,并且您很可能找到所需内容。
答案 1 :(得分: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;
正如Joe建议的那样,您也可以在动态生成的数据步骤中编写自己的分隔符逻辑,例如
/*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;