【问题标题】:Deleting unwanted characters from a text file using SAS使用 SAS 从文本文件中删除不需要的字符
【发布时间】:2015-12-04 03:13:45
【问题描述】:

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

【问题讨论】:

  • 我很惊讶最后一个字段没有用引号引起来,当字段在变量值中嵌入分隔符时,通常最好将其放在引号中。

标签: sas csv


【解决方案1】:

只需将文件作为一系列文本字段读取,然后使用不同的分隔符重新写入即可。您的问题是前几个字段是逗号分隔的,最后两个是管道分隔的。看起来您有三个字段,但第一个字段是 7 个逗号分隔值。因此,使用 ('|') 作为分隔符读取最后两列,使用管道和逗号 ('|,') 作为分隔符读取前 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;

这将生成您请求的内容。

请注意,如果您使用逗号 (',') 作为分隔符编写新文件,它将看起来像这样,因为 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;

【讨论】:

  • 非常感谢。第二个选项效果很好。非常感谢您的帮助。
【解决方案2】:

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

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

【讨论】:

  • 您能否再解释一下。准确地说,这些行在代码中的位置。很抱歉我对 SAS 很陌生。
  • 抱歉,您是在 SAS 中对此文件进行任何其他处理还是只是将分隔符转换为 |从','?
  • 只是将分隔符从逗号更改为管道。输入数据中有管道,我不想更改它们。此外,如果第 6 列之后的任何地方都有逗号,我不想将其更改为管道。对不起,它令人困惑:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2013-10-18
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多