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

Exporting to a text file in SAS with a double delimitter

我正在尝试使用双竖线分隔符“||”当我将文件从 SAS 导出到 txt 时。不幸的是,它似乎只能正确分隔 header 行并使用单一版本的数据。

密码是:

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

proc export 不使用双管道的原因是它生成一个数据步骤来执行导出,它使用 file 语句。这是一个已知的限制 - 引用帮助文件:

Restriction: Even though a character string or character variable is accepted, only the first character of the string or variable is used as the output delimiter. This differs from INFILE DELIMITER= processing.

header 行 || 有效,因为 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 767;
 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 767;
    text = catx('||',&VNAMES);
    put text;
run;

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

您可以相当轻松地创建自己的 proc export,方法是使用 dictionary.columnssashelp.vcolumn 构建 put 语句。如果您需要帮助,请随时提出更具体的问题,但搜索数据驱动的输出很可能会找到您需要的内容。