使用双分隔符导出到SAS中的文本文件

时间:2015-01-12 20:19:26

标签: sas delimiter

我试图使用双管分隔符" ||"当我将文件从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

2 个答案:

答案 0 :(得分:4)

如果要使用双字符分隔符,则需要在数据步骤文件创建中的dlmstr语句中使用dlm而不是file。不幸的是,您不能使用proc export,因为它不支持dlmstr

您可以使用proc exportdictionary.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;