按字母顺序对字符串中的字母进行排序- SAS
Sort letters in string alphabetically- SAS
我想按字母顺序对字符串中的字母进行排序。
例如
'apple' = 'aelpp'
我看到的唯一有点相似的函数是SORTC,但我想尽可能避免将每个单词拆分成一个字母数组。
Joe 说得对 - 没有内置函数可以执行此操作。你在这里有两个选项,我可以看到:
- 将您的字符串拆分为一个数组,然后使用
call sortc
对数组进行排序。如果您首先定义了一个足够长的数组,您可以使用 call pokelong
相当轻松地完成此操作。
- 实施您选择的 sorting algorithm。如果您选择走这条路,我建议您使用
=
符号左侧的 substr
来更改单个字符,而无需重写整个字符串。
这是您如何执行 #1 的示例。 #2 会做更多的工作。
data _null_;
myword = 'apple';
array letters[5] ;
call pokelong(myword,addrlong(letters1),5); /*Limit # of chars to copy to the length of array*/
call sortc(of letters[*]);
myword = cat(of letters[*]);
putlog _all_;
run;
N.B。对于此处使用的长度为 5 的数组,请确保在使用 call pokelong
时仅将字符串的前 5 个字符写入数组开头的内存中,以避免溢出到数组末尾 - 否则在处理 myword
的较长值时,您可以覆盖其他任意内存部分。这可能会导致不良的副作用,例如应用程序/系统崩溃。此外,这种用于填充数组的技术在 SAS University Edition 中不起作用 - 如果您正在使用它,则需要改用 do-loop。
我对此做了一些测试 - 使用一台 CPU 几年前的 PC 对从整个 ASCII 可打印范围中选择的字符组成的长度为 100 的 2m 随机单词进行排序大约需要 15 秒- 比创建测试数据集花费的时间略少。
data have;
length myword 0;
do i = 1 to 2000000;
do j = 1 to 100;
substr(myword,j,1) = byte(32 + int(ranuni(1) * (126 - 32)));
end;
output;
end;
drop i j;
run;
data want;
set have;
array letters[100] ;
call pokelong(myword,addrlong(letters1),100); /*Limit # of chars to copy to the length of array*/
call sortc(of letters[*]);
myword = cat(of letters[*]);
drop letters:;
run;
我想按字母顺序对字符串中的字母进行排序。
例如
'apple' = 'aelpp'
我看到的唯一有点相似的函数是SORTC,但我想尽可能避免将每个单词拆分成一个字母数组。
Joe 说得对 - 没有内置函数可以执行此操作。你在这里有两个选项,我可以看到:
- 将您的字符串拆分为一个数组,然后使用
call sortc
对数组进行排序。如果您首先定义了一个足够长的数组,您可以使用call pokelong
相当轻松地完成此操作。 - 实施您选择的 sorting algorithm。如果您选择走这条路,我建议您使用
=
符号左侧的substr
来更改单个字符,而无需重写整个字符串。
这是您如何执行 #1 的示例。 #2 会做更多的工作。
data _null_;
myword = 'apple';
array letters[5] ;
call pokelong(myword,addrlong(letters1),5); /*Limit # of chars to copy to the length of array*/
call sortc(of letters[*]);
myword = cat(of letters[*]);
putlog _all_;
run;
N.B。对于此处使用的长度为 5 的数组,请确保在使用 call pokelong
时仅将字符串的前 5 个字符写入数组开头的内存中,以避免溢出到数组末尾 - 否则在处理 myword
的较长值时,您可以覆盖其他任意内存部分。这可能会导致不良的副作用,例如应用程序/系统崩溃。此外,这种用于填充数组的技术在 SAS University Edition 中不起作用 - 如果您正在使用它,则需要改用 do-loop。
我对此做了一些测试 - 使用一台 CPU 几年前的 PC 对从整个 ASCII 可打印范围中选择的字符组成的长度为 100 的 2m 随机单词进行排序大约需要 15 秒- 比创建测试数据集花费的时间略少。
data have;
length myword 0;
do i = 1 to 2000000;
do j = 1 to 100;
substr(myword,j,1) = byte(32 + int(ranuni(1) * (126 - 32)));
end;
output;
end;
drop i j;
run;
data want;
set have;
array letters[100] ;
call pokelong(myword,addrlong(letters1),100); /*Limit # of chars to copy to the length of array*/
call sortc(of letters[*]);
myword = cat(of letters[*]);
drop letters:;
run;