【问题标题】:Iterate through sas column values - string manipulation遍历 sas 列值 - 字符串操作
【发布时间】:2017-08-29 15:44:05
【问题描述】:

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

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

我通过检查该列中每个元素的十六进制代码来解决它。正如我所注意到的,只有最后一行(即成功行)没有 CR 字符(0D)。其他人都明白了。我发现 compress 函数对范围很有用,所以我在数据步骤中使用了它,但它没有删除 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;

和我的数据集:

我认为 compress 不能与列名一起使用,但我如何遍历列值以正确调用它?有没有更好的方法来达到同样的目标? 谢谢。

对乔的回答编辑问题: 是的,我尝试了两种读取 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 中没有值的数据集(最后一行除外)。

【问题讨论】:

    标签: string sas ascii


    【解决方案1】:

    也许你的问题行末尾有 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;
    

    【讨论】:

    • 谢谢@Tom,这是另一个有价值的解决方案:我在文档中读到输入@保留了在所谓的“自动变量”或缓冲区内的同一数据步骤中的最后一条记录,如_infile_。在这个 _infile_ 中,您可以删除所有变量值的 CR 字符。我做对了吗?
    • 基本上。 _INFILE_ 自动变量让您可以访问 SAS 用来存储从输入读取的当前行的内部缓冲区。第一个 INPUT 后面的 @ 告诉 SAS 你还没有从这一行读完。这是阻止下一个 INPUT 语句尝试读取输入中的下一行的原因。相反,它从通过写入 _INFILE_ 变量而修改的行中读取。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢乔的解决方案。现在压缩功能效果很好。我编辑了我的问题,以便为您提供有关我上一个问题的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多