我正在尝试使用SAS将分隔符从逗号更改为文本文件中的管道。输入文件中的数据类似于 -
Site,Variable,20151120010000,5.82,1,1,Project|Code|comment
Site,Variable,20151120020000,5.82,1,1,Project|Code|comment
Site,Variable,20151120030000,5.81,1,1,Project|Code|comment, out of service
我想将逗号(分隔符)更改为管道,但如果有逗号(例如在最后一行),我不想将其更改为管道。基本上是项目|代码|评论,停止服务是一栏。我正在使用下面的代码(由堆栈溢出成员建议) -
%let flname1=D:\temp\comma_file_%sysfunc(today(),yymmddn8.).txt;
%put &=flname1;
%let flname2=D:\temp\pipe_file_%sysfunc(today(),yymmddn8.).txt;
%put &=flname2;
data _null_;
length x1-x9 $200;
infile "&flname1" dsd dlm=',' truncover;
file "&flname2" dsd dlm='|';
input x1-x9;
put x1-x9;
run;
我使用此代码获得的输出类似于 -
Site|Variable|20151120010000|5.82|1|1|"Project|Code|comment"||
Site|Variable|20151120020000|5.82|1|1|"Project|Code|comment"||
Site|Variable|20151120030000|5.81|1|1|"Project|Code|comment"|out of service|
我希望输出看起来像 -
Site|Variable|20151120010000|5.82|1|1|Project|Code|comment
Site|Variable|20151120020000|5.82|1|1|Project|Code|comment
Site|Variable|20151120030000|5.81|1|1|Project|Code|comment,out of service
这可能很简单,但我刚开始学习SAS。非常感谢任何帮助。
答案 0 :(得分:0)
我只需导入包含管道分隔的原始列,然后使用scan创建三个新列以拆分数据:
data test;
set test;
project=scan(piped,1,'|');
code=scan(piped,2,'|');
comment=scan(piped,3,'|');
run;
答案 1 :(得分:0)
只需将文件作为一系列文本字段读取,然后使用不同的分隔符重新编写。您的问题是前几个字段以逗号分隔,后两个字段以管道分隔。看起来你有三个字段,但第一个字段是7个逗号分隔值。因此,使用('|'
)作为分隔符读取最后两列,使用管道和逗号('|,'
)作为分隔符读取前7列。然后使用另一个分隔符重新写入它。您需要制作两个filerefs,以允许使用不同的分隔符进行处理。
filename original "sample1.dat";
filename copy "sample1.dat";
filename out "sample1.csv";
data _null_;
length field1-field9 $200;
infile original dsd dlm='|' truncover;
input field7-field9 ;
infile copy dsd dlm=',|' truncover;
input field1-field7 ;
file out dsd dlm='|';
put field1-field9;
run;
这将产生您的要求。
请注意,如果使用逗号(','
)作为分隔符编写新文件,则它将如此显示,因为SAS将使用引号保护嵌入分隔符。
Site,Variable,20151120010000,5.82,1,1,Project,Code,comment
Site,Variable,20151120020000,5.82,1,1,Project,Code,comment
Site,Variable,20151120030000,5.81,1,1,Project,Code,"comment, out of service"
或者您可以使用SCAN()
函数将第一个字段分解为7.这样就无需读取包含多个分隔符的行。
data _null_;
length field1-field9 $200;
infile original dsd dlm='|' truncover;
input field7-field9 ;
array field (9);
do i=1 to 7;
field(i) = scan(field7,i,',','m');
end;
file out dsd dlm='|';
put field1-field9;
run;