[英]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.