我几个月来一直在研究这个问题。我无法获得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条记录,所以我在处理能力方面也遇到了一些问题。
任何帮助都将不胜感激。
杰夫
答案 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,"")
排序对话框:
结果:
您可以使用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
当我们运行上面的原始查询时,我们得到了这个:
现在在查询构建器中,只需对第一个派生列进行排序,然后对第二个派生列进行排序。
例如:
运行查询,我们得到以下结果:
编辑:
看着你想要的结果,看起来上面的排序是错误的。我们必须正确并用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
结果如下:
鉴于您的小表大小,上述查询应该表现得非常好。