迭代通过SAS列的值 - 字符串操作
我的目标是获得一个CSV文件的几个数字列,所谓的气温我,与其他分析走得更远。不幸的是,最后一列是以文本类型获得的我SAS文件中读取输入()函数可以将文本转换为数字格式,所以我试图调用它,但它失败的第5行,显示日志窗口:迭代通过SAS列的值 - 字符串操作
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中没有值的数据集(最后一行除外)。
也许你的问题行最后有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;
我怀疑最终的答案就在您的CSV输入:即,你也许可以修改你的输入,因此回车显示不出来。如果您提供的输入,我们也许可以帮助那里的一些信息(即,你怎么导入此 - ?您使用PROC IMPORT
我怀疑为什么在那里的第一个五年行,但不是过去那种0D
字符),这是可能的TERMSTR
或DLM
可能可以在这里帮助。
但是,既然你问这个问题:你不能用/r
的方式这样做 - 这并不是一个SAS有意义的事情。你需要compress(x,byte(13))
或compress(x,'0D'x)
,两者都可以正常工作。
感谢乔的解决方案。现在压缩功能很好。我编辑了我的问题,给你更多关于我最后一个问题的细节。 –
感谢@Tom,这是另一个有价值的解决方案:我在文档中读入了@在所谓的“自动变量”或缓冲区(如\ _infile \ _)内保留最后一条记录的相同数据步骤。在这个\ _infile \ _中,你可以删除所有变量的值CR字符。我是否正确? –
本质上。 \ _INFILE_自动变量让您访问SAS用来存储从输入读取的当前行的内部缓冲区。第一个INPUT上的尾部@告诉SAS你还没有完成从这条线读取。这是保持下一条INPUT语句不会尝试读取输入中的下一行的原因。而是从写入\ _INFILE_变量的行中读取。 – Tom