我的目标是从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;
我认为压缩不能与列名一起使用,但是如何迭代列值才能正确调用它?有没有更好的方法达到同样的目标? 感谢。
乔的回答编辑问题: 是的,我尝试了两种方法来读取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中没有值的数据集(最后一行除外)。
答案 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
个字符但没有过去那个?)TERMSTR
或DLM
可能会在这里提供帮助。
但是,既然你问这个问题:你不能像你那样使用/r
- 这对SAS来说并不是一件有意义的事情。您需要compress(x,byte(13))
或compress(x,'0D'x)
,两者都可以正常工作。