如何将 SAS 数据集转换为 CSV 文件,而其中的单个文件具有逗号值

How to convert a SAS dataset into CSV file whereas a single filed in it has value with comma

我有一个 SAS 数据集,让我们说

它有 4 列 A、B、C、D 和值

A = x
B = x
C = x
**D = x,y**

此处 D 列在单个列中有两个值,将其转换为 CSV 格式时会生成一个值为 Y 的新列。如何避免这种情况并将 SAS 数据集转换为 CSV 文件?

 * get some test records in a file;
Data _null_;
    file 'c:\tmp\test.txt' lrecl=80;
    put '1,22,Hans Olsen,Denmark,333,4';
    put '1111,2,Turner, Alfred,England,3333,4';
    put '1,222,Horst Mayer,Germany,3,4444';
run;

* Read the file as a delimited file; 
data test; infile 'c:\tmp\test.txt' dsd dlm=',' missover;
    length v1 v2 8 v3 v4  v5 v6 8;
    input
        'V1'n : ?? BEST5.
        'V2'n : ?? BEST5.
        'V3'n : $CHAR40.
        'V4'n : $CHAR40.
        'V5'n : ?? BEST5.
        'V6'n : ?? BEST5.;
run;

* Read the file and write another file.
* If 6 delimiters and not 5, change the third to #;
data test2; 
    infile 'c:\tmp\test.txt' lrecl=80 truncover;
    file 'c:\tmp\test2.txt' lrecl=80;
    length rec ;
    drop pos len;
    input rec $char80.;
    if count(rec,',') = 6 then do;
        call scan(rec,4,pos,len,',');
        substr(rec,pos-1,1) = '','';
    end;
    put rec;
run;

* Read the new file as a delimited file; 
data test2; infile 'c:\tmp\test2.txt' dsd dlm=',' missover;
    length v1 v2 8 v3 v4  v5 v6 8;
    input
        'V1'n : ?? BEST5.
        'V2'n : ?? BEST5.
        'V3'n : $CHAR40.
        'V4'n : $CHAR40.
        'V5'n : ?? BEST5.
        'V6'n : ?? BEST5.;
run;

在此代码中,它添加了“#”,但我想在输出中添加“,”本身。 谁能指导我这样做? 提前致谢!!

如果您的字段值包含字段分隔符,您将需要用双引号将字段值引起来。当数据库类型指定为 CSV

时,Proc EXPORT 将执行此类双引号

示例:

data have;
A = 1;
B = 2;
C = 3;
D = 'x,y';
run;

filename csv temp;

proc export data=have outfile=csv dbms=csv;
run;

data _null_;
  infile csv;
  input;
  put _infile_;
run;

日志将显示导出的文件包含生成的 csv 文件中所需的双引号值。

日志

A,B,C,D
1,2,3,"x,y"

听起来您是从创建不正确的 CSV 文件开始的。

1,22,Hans Olsen,Denmark,333,4
1111,2,Turner, Alfred,England,3333,4
1,222,Horst Mayer,Germany,3,4444

应该是这样的:

1,22,Hans Olsen,Denmark,333,4
1111,2,"Turner, Alfred",England,3333,4
1,222,Horst Mayer,Germany,3,4444

如果您确定知道唯一带有嵌入逗号的字段是第三个字段,那么您可以使用数据步骤将其读入并生成有效文件。

data _null_;
  infile bad dsd truncover ;
  file good dsd ;
  length v1-v6 dummy 0;
  input v1-v2  @;
  do i=1 to countw(_infile_,',','q')-5;
    input dummy @;
    v3=catx(', ',v3,dummy);
  end;
  input v4-v6 ;
  put v1-v6 ;
run;

一旦您拥有格式正确的 CSV 文件,它就很容易阅读。

data want;
  infile good dsd truncover ;
  length v1-v2 8 v3-v4  v5-v6 8;
  input v1-v6 ;
run;

但是如果额外的逗号可能出现在任何字段中,那么您可能需要人工修复这些行。