迭代通过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; 

和我的数据集: 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中没有值的数据集(最后一行除外)。

也许你的问题行最后有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; 
+0

感谢@Tom,这是另一个有价值的解决方案:我在文档中读入了@在所谓的“自动变量”或缓冲区(如\ _infile \ _)内保留最后一条记录的相同数据步骤。在这个\ _infile \ _中,你可以删除所有变量的值CR字符。我是否正确? –

+1

本质上。 \ _INFILE_自动变量让您访问SAS用来存储从输入读取的当前行的内部缓冲区。第一个INPUT上的尾部@告诉SAS你还没有完成从这条线读取。这是保持下一条INPUT语句不会尝试读取输入中的下一行的原因。而是从写入\ _INFILE_变量的行中读取。 – Tom

我怀疑最终的答案就在您的CSV输入:即,你也许可以修改你的输入,因此回车显示不出来。如果您提供的输入,我们也许可以帮助那里的一些信息(即,你怎么导入此 - ?您使用PROC IMPORT我怀疑为什么在那里的第一个五年行,但不是过去那种0D字符),这是可能的TERMSTRDLM可能可以在这里帮助。

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

+0

感谢乔的解决方案。现在压缩功能很好。我编辑了我的问题,给你更多关于我最后一个问题的细节。 –