String 按字母顺序对字符串中的字母进行排序-SAS

String 按字母顺序对字符串中的字母进行排序-SAS,string,sorting,sas,alphabetical,String,Sorting,Sas,Alphabetical,我想把字母按字母顺序排列成一个字符串 例如 我见过的唯一一个有点类似的函数是,但如果可能的话,我希望避免将每个单词拆分成一个字母数组。乔的权利-没有内置函数可以做到这一点。我可以看到这里有两个选项: 将字符串拆分为一个数组,并使用调用sortc对数组进行排序。如果您首先定义了一个足够长的数组,那么您可以使用call pokelong轻松地完成此操作 实现一个您选择的应用程序。如果您选择这样做,我建议使用=符号左侧的substr来更改单个字符,而不重写整个字符串 下面是一个你可能会怎么做的例子#1

我想把字母按字母顺序排列成一个字符串

例如


我见过的唯一一个有点类似的函数是,但如果可能的话,我希望避免将每个单词拆分成一个字母数组。

乔的权利-没有内置函数可以做到这一点。我可以看到这里有两个选项:

  • 将字符串拆分为一个数组,并使用
    调用sortc
    对数组进行排序。如果您首先定义了一个足够长的数组,那么您可以使用
    call pokelong
    轻松地完成此操作
  • 实现一个您选择的应用程序。如果您选择这样做,我建议使用
    =
    符号左侧的
    substr
    来更改单个字符,而不重写整个字符串
  • 下面是一个你可能会怎么做的例子#1#2将是更多的工作

    data _null_;
        myword = 'apple';
        array letters[5] $1;
        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;
    
    注意:对于此处使用的长度为5的数组,确保在使用
    调用pokelong
    时,仅将字符串的前5个字符写入数组开头的内存中,以避免溢出超过数组末尾-否则,在处理较长的
    myword
    值时,可能会覆盖内存的其他任意部分。这可能会导致不良副作用,例如应用程序/系统崩溃。此外,这种填充数组的技术在SAS大学版中不起作用-如果您使用它,则需要使用do循环

    我对此做了一个小测试——使用一台几年前的PC的单个CPU,从整个ASCII可打印范围中选择字符,对200个长度为100的随机单词进行排序,耗时约15秒——略少于创建测试数据集所需的时间

    data have;
      length myword $100;
      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] $1;
      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;
    

    如果你问的是这样的话,没有一个函数能做到这一点。你试过了吗?你知道1号有多贵吗?我有大约200万张唱片。最后,我将使用第二个列表并搜索最接近的匹配项。我知道这可能是一种奇怪的模糊匹配方法,但有一些突出的情况让我相信这是最好的方法。@JamesSteele添加了一个测试-限制因素(SAS通常是这样)似乎是磁盘I/O。这是一个很好的解决方案,除了一件事:空白字符串中的空格。我要做两个更改:一个是生成例程,一个是WANT datastep;长度:100美元;调用streaminit(7);i=1至2000000;do j=1至100;如果兰特(‘统一’)小于0.05且j>5,则离开;substr(myword,j,1)=字节(32+int(rand('Uniform')*(126-32));结束;产出;呼叫丢失(myword);结束;滴入i j;运行这是我建议的解决方案。另外,我认为,添加临时数组b/c是您打算做的事情。。。(无法使代码格式正常工作-注意uu-字母[]调用中的临时和星号)`需要数据;集有;数组字母[100]$1临时;呼叫博科龙(myword,addrlong(字母[1]),100);调用sortc(字母[]);myword=左(字母[]类别);运行`
    data have;
      length myword $100;
      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] $1;
      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;