从分隔文件中读取数字数据

时间:2017-12-23 22:04:53

标签: sas

在SAS上读取分隔文件时,可以使用length语句设置字符变量的长度。但是,用普通数字不能做到这一点(没有逗号,没有美元符号,标准数据等)。从我能想到的内容中设置这些语句长度的唯一方法是使用commaw.信息。这是否合情合理,如果我们只想阅读简单的数字,是否有长篇陈述?

我也想知道,如果我有一段数据“$ 105.93”,我可以将其读作dollar3.2。但是将其作为dollar12.2阅读似乎没有什么区别。为什么呢?

谢谢。

2 个答案:

答案 0 :(得分:1)

可变长度和格式宽度是独立的东西

LENGTH是SAS用于在数据集中存储数据的字节数。由于SAS使用64位浮点数,因此数字变量的长度必须介于3到8个字节之间。 (实际上,您可以在IBM大型机上存储少至2个字节的数字,因为它们使用了不同的浮点表示。)格式或信息使用的WIDTH是将值打印为文本所需的字符数。因此,如果您正在阅读或编写像$1,205.93这样的字符串,则需要使用9个字符。但是因为它是一个数字,你需要用8个字节存储它。因此,即使格式宽度比这长,LENGTH也是8。

列表模式输入忽略信息宽度

第二个困惑是,当您使用列表模式INPUT(而不是格式化模式)时,SAS将忽略您可能附加到特定变量的任何信息上指定的宽度。相反,它会将信息应用于它在下一个分隔符之前看到的所有下一个单词。您可以考虑调整信​​息宽度以匹配数据的宽度。所以如果运行这样的程序:

data want ;
  input id cost ;
  informat cost comma1. ;
cards;
1 $103.93
;

COST将被正确设置,因为忽略了informat语句中指定的1的宽度。请注意,使用:修饰符允许将信息规范插入INPUT语句而不会导致SAS从列表模式切换到格式化模式时,同样适用。

滥用信息规范的小数部分

FORMAT 上,小数规格告诉SAS要打印的小数点右边有多少位数。但是当您在 INFORMAT 上添加小数规范时,您告诉SAS在输入字符串没有小数点的位置放置小数点。基本上你是在告诉SAS使用10的幂来划分它看到的任何整数值。因此,除非你肯定你的输入流故意消除了1和10之间的时间段,否则你永远不应该为INFORMAT指定任何小数值。所以你不想使用DOLLAR12.2信息。 (另请注意,DOLLAR。和COMMA.informats之间没有区别。在尝试将字符串转换为数字之前,它们都会删除逗号和美元符号。)

答案 1 :(得分:0)

  

在SAS上读取分隔文件时,可以使用length语句设置字符变量的长度。但是,用普通数字不能做到这一点(没有逗号,没有美元符号,标准数据等)。

您可以指定数字变量的长度,但length对应于变量可以存储的字节数。对于数字,一个字节存储多个数字。

http://support.sas.com/documentation/cdl/en/hostwin/69955/HTML/default/viewer.htm#n04ccixfia6l2pn1f8szvttqg3hm.htm

这是一个显示如何保存的示例。

data have;
    infile cards dlm=';';
    length V1 V2 8 V3 4;
    informat V1 dollar3.2 V2 best12. V3 dollar8.2;
    format v1 dollar12.2 v2 8. v3 dollar8.2;
    input v1 v2 v3;
    datalines4;
$12.22; 24; $1342
$145.22; 25; $13.42
$45.01; 22; $100.1
;;;;
run;

proc contents data=have;
run;