如何将 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;
但是如果额外的逗号可能出现在任何字段中,那么您可能需要人工修复这些行。
我有一个 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;
但是如果额外的逗号可能出现在任何字段中,那么您可能需要人工修复这些行。