我有一个在MS SSIS中创建的固定长度记录的二进制文件,我需要读入SAS 9.4 64位。目前,使用以下代码在数据步骤中读取文件:
data outputdata.(EOC=no
compress = yes
keep = a b c);
length a $4.;
length b 4.;
infile "&inputfile." obs= 999999999 lrecl=308 recfm=F;
input @5 a $4.
@9 b ib4.
@13 c rb4.
;
...
...
...
除c外,所有变量都正确读入输出数据集。 c是浮点数,2dp,最小值0.00,最大值99.99。在它有用的情况下,c作为VB.Net Single值开始其生命周期,使用VB.Net的BitConverter.GetBytes(Single)
转换为二进制,返回一个4字节的数组。然后将该数组写入二进制记录。
从我对该主题rb4.
的研究中可以看出,是从SAS中的二进制记录中读取4字节浮点('真实'?)值的正确方法可能问题在于如何格式化该值以使其在输出数据集中正确显示。我尝试过以下方法:
format c rb2.2;
format c 2.2;
format c 4.;
以及格式语句值的变体(例如format c 5.;
等)。我尝试过的所有格式都没有产生任何接近正确值的格式;大多数都是科学形式的数字,如17E9。
c是二进制文件的新增功能,是唯一真正的'变量包含在其中,所以我没有一个例子可供使用。我是SAS的新手,并继承了这个项目,所以这个问题很有可能是一个相当重要的问题!
任何指导意见。感谢
答案 0 :(得分:1)
重复我的评论作为答案...
你应该使用FLOAT4。读取由VB.NET BitConverter.GetBytes(Single)
函数写入的值。 RB4。 informat读取四个输入字节,好像它们是截断的双精度浮点值,但VB.NET函数的输出是单精度浮点值,又称“浮点数”,其中是不一样的。
有关FLOAT format的SAS文档页面的说明解释了:
FLOATw.d信息在浮点值与截断的双精度值不同的操作环境中非常有用。
在IBM大型机系统上,四字节浮点数与截断的八字节浮点数相同。但是,在使用IEEE浮点标准的操作环境中,例如基于IBM PC的操作环境和大多数UNIX平台,四字节浮点数与截断的双精度数不同。因此,RB4。 informat不会产生与FLOAT4相同的结果。除IEEE之外的浮点表示可能具有相同的特征。使用FLOAT4读取的值。通常来自在您的操作环境中运行的其他外部程序。