使用SAS从文本文件中删除不需要的字符

时间:2015-12-03 16:51:02

标签: sas delimited-text

我正在尝试使用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。非常感谢任何帮助。

2 个答案:

答案 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;