自然或人类排序

时间:2017-09-12 16:00:24

标签: sql excel ms-access

我几个月来一直在研究这个问题。我无法获得natural(真正的字母数字)结果。令我感到震惊的是,自1992年RPG EBCDIC 299-8, 3410L-87, 3410L-88, 420-A20, 420-A21, 420A-40, 4357-3, AN3H10A, K117GM-8, K129-1, K129-15, K271B-200L, K271B-38L, K271D-200EL, KD1051, KD1062, KD1092, KD1108, KD1108, M8000-3, MS24665-1, SK271B-200L, SAYA4008 以来我无法得到它们。

我正在寻找SQL,VBS或简单excel或访问的任何解决方案。这是我的数据:

AN3H10A, 
KD1051, 
KD1062, 
KD1092, 
KD1108, 
KD1108, 
K117GM-8, 
K129-1, 
K129-15, 
MS24665-1,
M8000-3, 
SAYA4008, 
SK271B-200L

我正在寻找的订单是真正的字母数字顺序,如下所示:

<?php
function findCommand($arrFound, $strFind)
{
    $arrFind = explode(' ', $strFind);
    while ($arrFound !== false and list($key, $strCommand) = each($arrFind)) {
        $arrSearch = $arrFound['subcommands'];
        if (($key = array_search($strCommand, array_column($arrSearch, 'name'))) === false) {
            $arrFound = false;
        } else {
            $arrFound = $arrSearch[$key];
        }
    }
    return $arrFound;
}

// get json from file and convert it to an array
$arrJson = json_decode(file_get_contents('items.json'), true);

$arrCommand = findCommand($arrJson, 'site create');
var_dump($arrCommand);

$arrCommand = findCommand($arrJson, 'term delete');
var_dump($arrCommand);

库存是7800条记录,所以我在处理能力方面也遇到了一些问题。

任何帮助都将不胜感激。

杰夫

5 个答案:

答案 0 :(得分:1)

在本机Excel中,您可以添加多个排序列以返回每个字符的ASCII代码,但如果该字符是数字,则在代码中添加一个大数字(例如1000)。

然后对每个辅助列进行排序,包括表中的第一列,但不在排序中。

公式:

=IFERROR(CODE(MID($A1,COLUMNS($A:A),1))+AND(CODE(MID($A1,COLUMNS($A:A),1))>=48,CODE(MID($A1,COLUMNS($A:A),1))<=57)*1000,"")

排序对话框:

enter image description here

结果:

enter image description here

您可以使用VBA实现类似的算法,也可能使用SQL。我不喜欢VBS或Access。

答案 1 :(得分:0)

您可以尝试使用格式按

顺序左边填充字符串
select column
from my_table 
order by  Format(column, "0000000000")

答案 2 :(得分:0)

添加排序列:

, iif (left(fieldname, 1) between '0' and '9', 1, 0) sortField
etc
order by sortField, FieldName

答案 3 :(得分:0)

让我们说你的数据在#34; A&#34;栏中。如果你把这个公式放在&#34; B&#34; =IFERROR(IF(LEFT(A1,1)+1>0,"ZZZZZZZ "&A1,A1),A1),它会自动在所有数值前添加Z,这样当您对A-Z进行排序时,它们将自然地出现在所有字母值之后。以后你可以找到并替换那个有趣的ZZZZZZ字符串...

答案 4 :(得分:0)

有很多方法,但在这种情况下,构建两个分隔分隔符( - )的列可能是最少量的工作。

然后“填充”右对齐的结果(空格或0),然后对两列进行排序。

所以在查询构建器中我们有这个:

SELECT Field1, 
Format(
Mid(field1,1,IIf(InStr(field1,"-")=0,50,InStr(field1,"-")-1)),
">@@@@@@@@@@") AS Expr1,
Format(
Mid(field1,IIf(InStr(field1,"-")=0,99,InStr(field1,"-")+1)),
">@@@@@@@@@@") AS Expr2
FROM Data

当我们运行上面的原始查询时,我们得到了这个:

enter image description here

现在在查询构建器中,只需对第一个派生列进行排序,然后对第二个派生列进行排序。

例如:

enter image description here

运行查询,我们得到以下结果:

enter image description here

编辑:

看着你想要的结果,看起来上面的排序是错误的。我们必须正确并用0填充。

所以第二次尝试:

SELECT Field1, 
Left(Mid(field1,1,IIf(InStr(field1,"-")=0,30,InStr(field1,"-")-1)) 
& String(30,"0"),30) AS Expr1, 
Left(Mid(field1,IIf(InStr(field1,"-")=0,99,InStr(field1,"-")+1)) 
& String(30,"0"),30) AS Expr2
FROM Data

结果如下:

enter image description here

鉴于您的小表大小,上述查询应该表现得非常好。