SAS出口问题,因为它提供了额外的双引号

时间:2018-12-20 16:00:11

标签: sas

我正在尝试将SAS数据导出为CSV,此处的数据集名称为abc,格式为

LINE_NUMBER描述
524JG 24PC AMEFA复古餐具“ DUBARRY”

我正在使用以下代码。

filename exprt "C:/abc.csv" encoding="utf-8";

proc export data=abc
outfile=exprt
dbms=tab;
run;

输出是

LINE_NUMBER描述
524JG“ 24PC AMEFA VINTAGE CUTLERY SET”“ DUBARRY”“”

因此,这里的描述之前和之后都有双引号,而DUBARRY词之后和之前还有其他双引号。我不知道发生了什么事。有人可以帮我解决这个问题,让我了解这里发生的一切吗。

预期结果:

LINE_NUMBER描述
524JG 24PC AMEFA复古餐具“ DUBARRY”

1 个答案:

答案 0 :(得分:2)

无需使用PROC EXPORT创建带分隔符的文件。您可以使用简单的DATA步骤编写它。如果要创建示例文件,则不要使用DSD语句上的FILE选项。但是请注意,根据所写入的数据,由于额外的不受保护的定界符,您可能会创建无法正确解析的文件。另外,您将无法代表缺失的值。

让我们制作一个样本数据集以进行测试。

data have ;
  input id value cvalue $ name $20. ;
cards;
1 123 A Normal
2 345 B Embedded|delimiter
3 678 C Embedded "quotes"
4 .   D Missing value
5 901 . Missing cvalue
;

基本上,PROC EXPORT正在使用DSD选项写入数据。像这样:

data _null_;
  set have ;
  file 'myfile.txt' dsd dlm='09'x ;
  put (_all_) (+0);
run;

这将产生一个这样的文件(用管道代替标签,以便您可以看到它们)。

1|123|A|Normal
2|345|B|"Embedded|delimiter"
3|678|C|"Embedded ""quotes"""
4||D|Missing value
5|901||Missing cvalue

如果仅删除DSD选项,则会得到一个类似这样的文件。

1|123|A|Normal
2|345|B|Embedded|delimiter
3|678|C|Embedded "quotes"
4|.|D|Missing value
5|901| |Missing cvalue

请注意第二行看起来是5个值而不是4个,因此无法知道如何将其拆分为4个值。还请注意,缺失值的最小长度至少为一个字符。

另一种方法是运行数据步骤,以将PROC EXPORT生成的普通文件转换为所需的变体格式。如果目标格式要求特殊字符,这也可能会给您提供添加特殊字符以保护特殊字符的位置。

data _null_;
  infile normal dsd dlm='|' truncover ;
  file abnormal dlm='|';
  do i=1 to 4 ;
    if i>1 then put '|' @;
    input field :$32767. @;
    field = tranwrd(field,'\','\\');
    field = tranwrd(field,'|','\|');
    len = lengthn(field);
    put field $varying32767. len @;
  end;
  put;
run;

您甚至可以使此数据步骤足够智能,以计算第一行中的字段数,并使用它来控制循环,从而无需进行硬编码。