SAS改变数字时,进程打印?



当我运行一个进程打印,其中段ID等于1234的输出显示段ID 1235。SAS实际上改变了19位数字的最后4位数字。Contents以num 8格式显示字段,格式为char 20。我只是提取数据并打印,不需要额外的格式化或处理。

如果我在不同的软件包中运行SQL语句,其中段ID等于1234(完全相同的记录),结果显示1234(最后4没有变化)。查询中提取的其他变量与SAS完全匹配,除了段ID。

我最好的猜测是这是一个格式问题,即使字段应该足够大,20>19 .

第二种猜测是现场的某种加密。通常,如果我没有适当的访问权限,字段将是空白的。但是我不熟悉这个新的数据源。

我将尝试为该字段添加特定格式的SAS数据提取,但希望听到任何其他建议。

谢谢!

PROC PRINT不是问题。在SAS中不能将19个十进制数字完全存储为数字。SAS将数字存储为64位浮点数。可以表示为连续整数的十进制数字的最大个数为15。在此之后,二进制表示将没有足够的位来精确地表示每个十进制字符串。查看文档中关于精度的描述:https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lrcon/p0ji1unv6thm0dn1gp4t01a1u0g6.htm

应该将这些东西存储为字符串。我怀疑你需要对这些值做任何算术。

如果您从远程数据库获取数据,请使用DBSASTYPE= dataset选项来控制创建的SAS变量的类型。

Contents以num 8显示字段,格式为char 20。我只是提取数据并打印,不需要额外的格式化或处理。

这没有意义。数字变量不应该有字符格式。

我认为你需要重新读取源字段作为一个字符从源。不确定从哪里"提取数据",但你需要修改这一步,以确保它首先被作为一个字符引入,否则无论如何你都会遇到这个问题。

据我所知,你无法修复数据的问题。

*issue with numeric;
data have;
input segmentID;
format segmentID 32.;
segmentIDChar=put(SegmentID, 32.);
cards;
1234567890123456789
;;;;
run;
proc print data=have;
run;
*no issue with character fields;
data have;
length segmentID $20.;
input segmentID $;
format segmentID $32.;
cards;
1234567890123456789
;;;;
run;
proc print data=have;
run;

结果:

Numeric Isssue
Obs segmentID           segmentIDChar
1   1234567890123456768 1234567890123456768

Character Issue
Obs segmentID
1   1234567890123456789

最新更新