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

使用SAS从文本文件中删除不需要的字符,sas,delimited-text,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 Site|Variable

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

我只需导入包含管道分离的原始列,然后使用扫描创建三个新列以分割数据:

data test;
  set test;
  project=scan(piped,1,'|');
  code=scan(piped,2,'|');
  comment=scan(piped,3,'|');
run;

只需将文件作为一系列文本字段读取,然后使用不同的分隔符重新写入即可。您的问题是,前几个字段用逗号分隔,后两个字段用管道分隔。看起来有三个字段,但第一个字段是7个逗号分隔的值。因此,最后两列使用(
“|”
)作为分隔符,前7列使用管道和逗号(
“|,”
)作为分隔符。然后使用另一个分隔符重新写入。您需要创建两个fileref,以允许使用不同的分隔符对其进行处理

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;
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;
这将生成您所请求的内容

请注意,如果您使用逗号(
,“
)作为分隔符来编写新文件,它将改为如下所示,因为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。这样就不需要读取带有多个分隔符的行

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

你能再解释一下吗。准确地说,这些行在代码中的位置。很抱歉,我是SAS的新手。对不起,您是否在SAS中对该文件进行任何其他处理,或者只是将delimeter转换为| from','?只是将分隔符从逗号更改为管道。输入数据中有管道,我不想更改它们。另外,如果第6列后面有逗号,我不想把它改成管道。抱歉,让人困惑:(我很惊讶最后一个字段不在引号中,当字段在变量值中嵌入分隔符时,通常最好将其放在引号中。非常感谢。第二个选项很好。我非常感谢您的帮助。