繁体   English   中英

在SAS中将变量类型从字符转换为具有不确定长度的数字

[英]Convert variable types from character to numeric with uncertain length in SAS

当我在SAS中使用PROC SQL语句时,有时需要将变量从字符转换为数字,反之亦然。 我通常使用以下两个查询:

INPUT(A.KEY_ID, 8.) = B.KEY_ID

要么

A.KEY_ID = PUT(B.KEY_ID, 8.)

我的问题是,如果变量的长度是7或8,我应该在KEY_ID之后加上什么长度? 我尝试了A.KEY_ID = PUT(B.KEY_ID,7.),它丢失了所有KEY_ID length = 8的记录。 当我使用A.KEY_ID = PUT(B.KEY_ID,8.)时,将无法找到长度为7的对应KEY_ID。

非常感谢你!

添加:

以下是我当前正在使用的查询。 LibnameA是本地库,而tableA是本地SAS表。 DatabaseB是与我连接的数据库。 两个表中都有Key_id列,并用作链接它们的键。 例如,key_id为1234567、12345678等。

当我使用以下查询时,将长度7放在put语句的末尾,所有具有8位数字key_ids的记录将找不到匹配项。

PROC SQL;
CREATE TABLE LIBNAMEA.WORKTABLE AS
SELECT
A.*,
B.VAR1,
B.VAR2
FROM LIBNAMEA.TABLEA A
LEFT JOIN DATABASEb.TABLEB B
ON A.KEY_ID = PUT(B.KEY_ID,8.)
;
QUIT;

更新结果:

如果我使用以下查询,它将返回192758行

ON A.KEY_ID = PUT(B.KEY_ID,7.)

如果我使用以下查询,它将返回192923行

ON A.KEY_ID = PUT(B.KEY_ID,8.)

如果我使用以下查询,它将返回192757行

ON INPUT(A.KEY_ID,8.) = B.KEY_ID

如果我使用以下查询,它将返回192757行

ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))

如果我使用以下查询,它将返回192757行

ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))

如果我使用以下查询,它将返回192757行

ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)

如果我使用以下查询,它将返回192757行

ON A.KEY_ID = PUT(B.KEY_ID,8.-L)

如您所见,只有当我使用ON A.KEY_ID = PUT(B.KEY_ID,8。)时,它才会返回192923行,这是表A中的所有行。但是,它将在表中找不到对应的key_id。 B,并在最终结果中返回空值。

如果我理解您的需要,唯一的问题是比较键的字符串版本-尝试时,带有INPUT的数字INPUT工作。

因此,对于字符串键,这对我有用:

a.key_id = trim(left(put(b.key_id,8.)))

您可以简化为:

a.key_id = compress(put(b.key_id,8.))

问题似乎是字符串键值中有空格。 您可能需要在两侧将其剥离。

如果您正在谈论整数,那么最好将值转换为数字并进行比较。 您可以使用相同的格式读取7个字符串和8个字符串。

 input(a.char_key_id,8.) = b.num_key_id

至于麻烦的原因可能是字符版本中的前导空格和/或前导零。 SAS比较会忽略尾随空格,因此您无需担心这些。

前导零

这是更大的问题。 因为大多数输入方法都会删除前导空格,所以比前导空格更可能看到字符变量带有前导零。 但是前导零的存在可以使相同的整数值具有多个字符表示形式 因此,您可以将123表示为'123','0123','00123'等。这不仅会导致合并,还会引起麻烦。

前导空间

当您尝试将整数转换为字符串时,这很可能是一个问题。 PUT()函数通常将值右对齐(因此它会生成前导空格),而大多数输入法最终将值左对齐(后跟空格)。 因此,如果使用put(12345,8.)将整数12345转换为字符串,则将导致三个前导空格' 12345' ,并且它将与字符变量中具有尾随空格'12345 '的值不匹配。 您可以在格式中添加对齐命令。 同样,由于SAS忽略尾随空格,因此您可以使用更长的格式。

put(b.num_key_id,F8.-L) = a.char_key_id

现在,如果您不知道变量是数字的还是字符的,并且您想要的代码对两者都适用,那么您可以使用类似的方法将其转换为字符然后再转换为数字。 但是请注意您的整数是否大于可以用12位数字表示的整数,因为SAS将使用BEST12。 格式以转换数字。

input(cats(a.key_id),8.) = input(cats(b.key_id),8.)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM