当我运行段 ID 等于 1234 的 proc 打印时,输出显示段 ID 1235。 SAS 实际上更改了 19 位数字的最后 4 位。内容以 num 8 格式显示字段,格式为 char 20。我只是提取数据并打印,无需额外的格式化或处理。
如果我在不同的软件包中运行 SQL 语句,其中段 ID 等于 1234(完全相同的记录),结果显示 1234(与最后 4 个没有变化)。查询中提取的其他变量与 SAS 的变量完全匹配,但段 ID 除外。
我最好的猜测是这是一个格式问题,即使该字段应该足够大,20 > 19。
第二个猜测是场上的某种 encryption 。通常,如果我没有适当的访问权限,则字段将为空白。但是我对这个新的数据源并不熟悉。
我将尝试为该字段添加一个特定的 format 到我的 SAS 数据拉取中,但我很想听听任何其他建议。
谢谢!
回答1
PROC PRINT 不是问题。您不能 store 19 位十进制数字与 SAS 中的数字完全相同。 SAS stores 数字为 64 位浮点数。可以表示为连续整数的十进制数字的最大数量是 15。之后二进制表示将没有足够的位来精确表示每个十进制字符串。从文档中检查有关精度的描述:https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lrcon/p0ji1unv6thm0dn1gp4t01a1u0g6.htm
你应该 store 诸如字符串之类的东西。我怀疑您是否需要对这些 values 进行任何算术运算。
如果您从远程数据库获取数据,请使用 https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/acreldb/n0v4ma1zb9lu99n1728j279rjcqi.htm 数据集选项来控制创建的 SAS 变量的类型。
回答2
Contents 以 num 8 格式显示字段,格式为 char 20。我只是提取数据并打印,无需额外格式化或处理。
那没有意义。数值变量不应包含字符 format。
我认为您需要将源字段作为源中的字符重新读取。不确定您从哪里“仅提取数据”,但您需要修改该步骤以确保首先将其作为角色引入,否则无论如何您都会遇到该问题。
据我所知,您无法按原样解决数据问题。
*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