使用SAS从文本文件中删除不需要的字符
我正在尝试使用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
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列后面有逗号,我不想把它改成管道。抱歉,让人困惑:(我很惊讶最后一个字段不在引号中,当字段在变量值中嵌入分隔符时,通常最好将其放在引号中。非常感谢。第二个选项很好。我非常感谢您的帮助。