SAS infile使用E截断长数字

SAS infile使用E截断长数字,sas,Sas,我四处搜索了一下,发现一些人问了类似的问题,但我没有找到一个我能找到的答案 我有制表符分隔的.txt文件,需要读入SAS数据库。这些文件包含一个18个数字长的序列号,因此SAS将其导入为“5.2231309E17” 理想情况下,SAS将导入所有字段,就像它们是文本而不是数字一样 更复杂的是,导入文件有两种不同的格式,只有打开文件后才可见,我无法从文件名中分辨出文件的格式。文件中也没有列名。所以我不知道哪一列是哪一列,直到我读了文件 目前我的出发点是: data Readin; infile fo

我四处搜索了一下,发现一些人问了类似的问题,但我没有找到一个我能找到的答案

我有制表符分隔的.txt文件,需要读入SAS数据库。这些文件包含一个18个数字长的序列号,因此SAS将其导入为“5.2231309E17”

理想情况下,SAS将导入所有字段,就像它们是文本而不是数字一样

更复杂的是,导入文件有两种不同的格式,只有打开文件后才可见,我无法从文件名中分辨出文件的格式。文件中也没有列名。所以我不知道哪一列是哪一列,直到我读了文件

目前我的出发点是:

data Readin;
infile foo dsd dlm='09'x truncover; 
input item1-item25;
run;
foo是类似于“c:\myfile.txt”的文件


非常感谢您的帮助。

这里有两个不同的问题。一个是“9.234E17”以科学记数法显示,另两个是你所读的数字,无论如何都不能准确地存储为数字

首先,这是最好的12。格式有效,这是类似这样的默认数字格式。它没有以一种有意义的方式截断它;如果您只需更改格式,请选择BEST32。例如,它将在精度范围内显示整个数字,并且它将始终在精度范围内像显示完整数字一样工作;如果我取了12345678,格式为BEST6.,它将显示为1.23e7,但如果我说
如果x=12345678,则执行;放x;结束,它将放置x,因为它将完全等于该值

然而,最后一部分很重要,也是问题的第二部分。您无法精确存储18位数字;15位数字是您在Windows和类似Intel类型的环境中可以精确存储的最大数字,在大型机上的结果略有不同。因此,您肯定需要将它们存储为字符,除非您不关心最后几个数字(听起来像是这样)


如果您有一个(任意)分隔的文件,最好的办法就是简单地编写一个数据步骤来读取它们,此时您可以自己将它们指定为字符。不要对大多数文本文件使用
proc import
,除非它们很容易出错。您可以做的是在运行
PROC IMPORT
后查看日志,并将该日志复制到程序中;然后进行调整,将序列号转换为字符字段(以及您要修复的任何其他内容)。

我遇到了类似的问题,我试图导入一个具有20位长字段的文件,我找到了一种解决方法,在Excel中打开该文件,并将列的属性从general更改为number,然后,当我导入文件时,它是作为一个数字导入的,而不是以科学符号导入的

我见过其他人这样做,我相信这会起作用,但我想将其作为自动化过程的一部分,因此需要SAS能够自己处理它。谢谢。SAS可能无法正确导入20位字段,因为SAS无法准确存储该数字;可以完全存储的最大值为15位。如果列类型为字符,则仍可以将其作为科学符号导入,如果将excel中的类型从“常规”更改为“数字”。它是在没有科学符号的情况下进口的,这不是我想做的,但效果很好。使用PROC导入获得正确的参数,然后创建两个INFLE语句来处理不同的文件类型。