迭代sas列值 - 字符串操作

时间:2017-08-29 15:44:06

标签: string sas ascii

我的目标是从CSV文件中获取几个名为temp i 的数字列,以进一步进行其他分析。不幸的是,最后一列是作为文本类型获得我在SAS文档中读到input()函数可以将文本转换为数字格式,所以我尝试调用它但是前5行显示失败,显示在日志窗口中:

NOTE: Invalid argument to function INPUT at line 3278 column 10.

我通过检查该列中每个元素的十六进制代码来解决它。正如我所注意到的,只有最后一行(即成功的行)没有CR字符(0D)。其他人得到了它。我发现压缩函数对作用域很有用,所以我在数据步骤中使用了它,但它没有删除CR字符。 我告诉你我的代码:

data work.meteo;
  drop var7;
  set work.meteo(rename=(var1=Prov var2=temp1 var3=temp2 var4=temp3 var5=temp4));
  x=compress(var6, '\r');
  format x $hex10.;
  temp5 = input(x, 8.);
run;

和我的数据集: dataset_weather

我认为压缩不能与列名一起使用,但是如何迭代列值才能正确调用它?有没有更好的方法达到同样的目标? 感谢。

乔的回答编辑问题: 是的,我尝试了两种方法来读取csv源文件;第一个包含Proc导入:

proc import  datafile = 'path-file\...\meteo.csv'
out= work.meteo
dbms = CSV replace;
getnames = no;
run;

第二个用infile和termstr制作。

data mydata;
  infile "path-file\...\meteo.csv" 
    dsd termstr=crlf truncover;
  input Prov $ temp1 temp2 temp3 temp4 temp5 ;
run;

在最后一个方法中,它会导致temp5中没有值的数据集(最后一行除外)。

2 个答案:

答案 0 :(得分:2)

也许你的问题行最后有CR + CR + LF?或者你真正的行结尾只是LF,只有前几行有CR。

尝试在读取变量之前从行中剥离所有CR。

data mydata;
  infile "path-file\...\meteo.csv" termstr=LF dsd truncover ;
  input @ ;
  _infile_ = compress(_infile_,'0D'x);
  input Prov $ temp1 temp2 temp3 temp4 temp5 ;
run;

答案 1 :(得分:1)

我怀疑最终答案在于您的CSV输入:即,您可能可以修改输入,以便回车不会显示。如果您提供有关输入的一些信息,我们可以帮助那些(即,您如何导入它 - 您使用的是PROC IMPORT我怀疑吗?为什么前五行中有0D个字符但没有过去那个?)TERMSTRDLM可能会在这里提供帮助。

但是,既然你问这个问题:你不能像你那样使用/r - 这对SAS来说并不是一件有意义的事情。您需要compress(x,byte(13))compress(x,'0D'x),两者都可以正常工作。