使用双分隔符导出到 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.columns
或 sashelp.vcolumn
构建 put
语句。如果您需要帮助,请随时提出更具体的问题,但搜索数据驱动的输出很可能会找到您需要的内容。
我正在尝试使用双竖线分隔符“||”当我将文件从 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.columns
或 sashelp.vcolumn
构建 put
语句。如果您需要帮助,请随时提出更具体的问题,但搜索数据驱动的输出很可能会找到您需要的内容。