在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.)时,它会找不到对应的length=7的KEY_ID。
非常感谢!
已添加:
以下是我目前正在使用的查询。 LibnameA 是本地库,tableA 是本地 SAS table。 DatabaseB 是我连接的数据库。 Key_id 列在两个 table 中,并用作 link 它们的键。例如,key_ids 为 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;
更新结果:
如果我使用以下查询,它 returns 192758 行
ON A.KEY_ID = PUT(B.KEY_ID,7.)
如果我使用以下查询,它 returns 192923 行
ON A.KEY_ID = PUT(B.KEY_ID,8.)
如果我使用以下查询,它 returns 192757 行
ON INPUT(A.KEY_ID,8.) = B.KEY_ID
如果我使用以下查询,它 returns 192757 行
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
如果我使用以下查询,它 returns 192757 行
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
如果我使用以下查询,它 returns 192757 行
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
如果我使用以下查询,它 returns 192757 行
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如您所见,只有当我使用 ON A.KEY_ID = PUT(B.KEY_ID,8.) 时,它才会 return 192923 行,这是 table A,但是在table B中找不到对应的key_ids,最终结果是returns null value.
如果我理解您的需要,唯一的问题是比较键的字符串版本——数字键与 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
至于您遇到问题的原因,可能是因为字符版本中的前导 spaces and/or 前导零。 SAS 比较会忽略尾随 space,因此您无需担心这些。
前导零
这是更大的问题。与前导 space 相比,前导零更有可能看到字符变量,因为大多数输入法都会删除前导 space。但是前导零的存在可以使 相同的整数值具有多个字符表示 。因此,您可以将 123 表示为“123”、“0123”、“00123”等。这会导致除了能够合并之外的麻烦。
前导空格
当您尝试将整数转换为字符串时,这更有可能成为问题。 PUT() 函数通常将值右对齐(因此它生成前导 space),而大多数输入法最终将值左对齐(尾随 spaces)。因此,如果您使用 put(12345,8.)
将整数 12345 转换为字符串,您将得到三个前导 spaces ' 12345'
并且它将与您在字符变量中的值不匹配,该值将具有尾随spaces '12345 '
。您可以将对齐命令添加到格式中。同样,由于 SAS 会忽略尾随的 space,您可以使用更长的格式。
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.)
当我在 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.)时,它会找不到对应的length=7的KEY_ID。
非常感谢!
已添加:
以下是我目前正在使用的查询。 LibnameA 是本地库,tableA 是本地 SAS table。 DatabaseB 是我连接的数据库。 Key_id 列在两个 table 中,并用作 link 它们的键。例如,key_ids 为 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;
更新结果:
如果我使用以下查询,它 returns 192758 行
ON A.KEY_ID = PUT(B.KEY_ID,7.)
如果我使用以下查询,它 returns 192923 行
ON A.KEY_ID = PUT(B.KEY_ID,8.)
如果我使用以下查询,它 returns 192757 行
ON INPUT(A.KEY_ID,8.) = B.KEY_ID
如果我使用以下查询,它 returns 192757 行
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
如果我使用以下查询,它 returns 192757 行
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
如果我使用以下查询,它 returns 192757 行
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
如果我使用以下查询,它 returns 192757 行
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如您所见,只有当我使用 ON A.KEY_ID = PUT(B.KEY_ID,8.) 时,它才会 return 192923 行,这是 table A,但是在table B中找不到对应的key_ids,最终结果是returns null value.
如果我理解您的需要,唯一的问题是比较键的字符串版本——数字键与 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
至于您遇到问题的原因,可能是因为字符版本中的前导 spaces and/or 前导零。 SAS 比较会忽略尾随 space,因此您无需担心这些。
前导零
这是更大的问题。与前导 space 相比,前导零更有可能看到字符变量,因为大多数输入法都会删除前导 space。但是前导零的存在可以使 相同的整数值具有多个字符表示 。因此,您可以将 123 表示为“123”、“0123”、“00123”等。这会导致除了能够合并之外的麻烦。
前导空格
当您尝试将整数转换为字符串时,这更有可能成为问题。 PUT() 函数通常将值右对齐(因此它生成前导 space),而大多数输入法最终将值左对齐(尾随 spaces)。因此,如果您使用 put(12345,8.)
将整数 12345 转换为字符串,您将得到三个前导 spaces ' 12345'
并且它将与您在字符变量中的值不匹配,该值将具有尾随spaces '12345 '
。您可以将对齐命令添加到格式中。同样,由于 SAS 会忽略尾随的 space,您可以使用更长的格式。
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.)