SAS 中的 Substr 命令无法正常工作

Substr command in SAS not working how it's supposed to

提问人:randsakka 提问时间:11/14/2023 最后编辑:Richardrandsakka 更新时间:11/21/2023 访问量:38

问:

我的 SAS 表中有一个名为 GEOID10 的变量,它由 10-11 位数字组成。前 4-5 位数字是州和县 FIPS 代码,最后 6 位数字是人口普查区。我想创建一个名为 TACTCE 的新变量,它只取GEOID10的最后 6 位数字,并删除前 4-5 位数字。

以下是我正在使用的 GEOID10 的一些示例:

1001020700
1001020900
1001020900
1001020900
1001020900
1001021000
56035000102
56037970500
56037971600
56037971600
56037971600
56037971600
56037971600

我在SAS中尝试了以下代码,但是它从未以正确的数字开始。

data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5), 6.);
run;

这个代码给了我 10207 而不是 020700 GEOID10 1001020700。

data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5, 6), 6.);
run;

这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。

data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5), 10.);
run;

此代码还给了我 1020700 而不是 020700 GEOID10 1001020700。

data My.Data;
set My.Data;
TRACTCE = input(compress(substr(GEOID10, 5),, 'kd'), 10.);
run;

此代码还给了我 1020700 而不是 020700 GEOID10 1001020700。

data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5, 6), 10.);
run;

这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。

data My.Data;
set My.Data;
TRACTCE = put(input(substr(GEOID10, 5, 6), 10.), z6.);
run;

这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。

SAS Substr 普查

评论

0赞 easleyfixed 11/14/2023
德拉特..无法找到 Left() 或 Right() 的标准化方法,只有子字符串 ..因此,如果您不能自动执行此操作,请希望 Length 命令存在?然后,您可以计算插槽并获得可能需要的值。
0赞 Tom 11/14/2023
变量GEOID10的前 10 个字符是什么?用 $HEX 20 打印。格式化,以便您可以看到实际字符。
0赞 Tom 11/14/2023
GEOID10是 CHARACTER 变量还是 NUMERIC 变量?
1赞 Tom 11/14/2023
请注意,LEFT() 和 RIGHT() 在 SAS 中工作正常。LEFT() 将前导空格移动到字符串的末尾。RIGHT() 将尾随空格移动到字符串的开头。SAS 使用固定长度的字符串,因此字符变量几乎总是有尾随空格。

答:

2赞 Tom 11/14/2023 #1

我无法从您分享的内容中分辨出您的字符串实际上包含什么。

但是根据您的第一个结果,我将假设第一个数字 1 出现在第二个位置。这意味着第二个数字 1 位于第 5 位。

23   data test;
24     GEOID10=' 1001020700';
25     TRACTCE = input(substr(GEOID10, 5), 6.);
26     put GEOID10 = $quote. TRACTCE= comma12. ;
27   run;

GEOID10=" 1001020700" TRACTCE=102,070

如果您想将 10 或 11 字节的字符串拆分为最后 6 个字节和其余部分,那么您可以使用 LENGTH() 函数找到最后一个非空白字符的位置并减去 5。

68   data test;
69     length geoid10 $11 left $5 right $6;
70     GEOID10= '1001020700';
71     loc = length(geoid10)-5;
72     left = substrn(geoid10,1,loc-1);
73     right = substrn(geoid10,loc);
74     format _character_ $quote.;
75     put (_all_) (=);
76   run;

geoid10="1001020700" left="1001" right="020700" loc=5

如果 GEOID10 是 NUMERIC,则不要在其上使用字符函数。只需使用算术即可。

61   data test;
62     GEOID10= 1001020700;
63     right = mod(geoid10,10**6);
64     left = int(geoid10/10**6);
65     format geoid10 Z11. right z6. left Z5.;
66     put (_all_) (=);
67   run;

GEOID10=01001020700 right=020700 left=01001
0赞 Mr. SATAN 11/21/2023 #2

好吧,您好,您能否使用以下更改运行代码,如果还有其他事情,请告诉我,好吗?

first_four=substr(string_variable, -1, 6);

last_three = substr(string_variable, length(string_variable)-2, 3);
run;

它将从末尾(从右到左)读取这些值,您可以根据需要调整“到”值。默认情况下,变量的值从左到右取,而 buffer 的填充。