按字母数字顺序对文本列进行排序(字母在数字之前)
Sort text column alphanumerically (letters before numbers)
我正在尝试按零件号按字母数字顺序对我们的库存列表进行排序,以便字母在数字之前排序。例如,给定列表:
0004006A
AN42B10
0400975
1968
MS21042L3
0004006
AN414A
J961393
AN4H16A
SR22SCW20
STD1410
4914
15KE51CA
21
560
排序后的列表应该是:
AN4H16A
AN414A
AN42B10
J961393
MS21042L3
SR22SCW20
STD1410
0004006
0004006A
0400975
15KE51CA
1968
21
4914
560
目前,我只能让它在字母前按数字排序,因此列表如下所示:
004006
0004006A
0400975
15KE51CA
1968
21
4914
560
AN414A
AN42B10
AN4H16A
J961393
MS21042L3
SR22SCW20
STD1410
(特别注意 AN4H16A
出现在 AN42B10
和 AN414A
之后,而不是之前。)
我尝试添加自定义列表(A、B、C、...、7、8、9),但按该列表排序得到的结果相同。
这可能吗?
以下解决方案适用于 LO Calc。如果数据在A1到A15中,则在B1中输入以下公式。
=IF(LEN($A1)<COLUMN()-1;-1;IF(CODE(MID($A1;COLUMN()-1;1))<=CODE(9);MID($A1;COLUMN()-1;1)+27;CODE(MID($A1;COLUMN()-1;1))-CODE("A")))
获取A1中字符串的第一个字符,然后确定该字符的排序值,"A"变为0(排序顺序中的第一个),“9”变为36(最后一个)排序顺序)。
现在,将字符串中的其余字符拖动并填充到 J15,然后将其他字符串向下拖动到 J15。
然后,转到数据 -> 排序。排序键 1 是列 B,排序键 2 是列 C,依此类推到 J。
或者,select A1 到 A15,然后 运行 以下 Python macro。
import uno
def custom_sort():
oSelect = XSCRIPTCONTEXT.getDocument().getCurrentSelection()
rowTuples = oSelect.getDataArray()
rowTuples = sorted(rowTuples, key=letters_then_numbers)
oSelect.setDataArray(rowTuples)
def letters_then_numbers(rowTuple):
strval = str(rowTuple[0])
sresult = ""
for c in strval:
if c in (str(i) for i in range(10)): # if character is a number
c = chr(ord('z') + int(c)) # then order it after z
sresult += c
return sresult
g_exportedScripts = custom_sort,
我正在尝试按零件号按字母数字顺序对我们的库存列表进行排序,以便字母在数字之前排序。例如,给定列表:
0004006A
AN42B10
0400975
1968
MS21042L3
0004006
AN414A
J961393
AN4H16A
SR22SCW20
STD1410
4914
15KE51CA
21
560
排序后的列表应该是:
AN4H16A
AN414A
AN42B10
J961393
MS21042L3
SR22SCW20
STD1410
0004006
0004006A
0400975
15KE51CA
1968
21
4914
560
目前,我只能让它在字母前按数字排序,因此列表如下所示:
004006
0004006A
0400975
15KE51CA
1968
21
4914
560
AN414A
AN42B10
AN4H16A
J961393
MS21042L3
SR22SCW20
STD1410
(特别注意 AN4H16A
出现在 AN42B10
和 AN414A
之后,而不是之前。)
我尝试添加自定义列表(A、B、C、...、7、8、9),但按该列表排序得到的结果相同。
这可能吗?
以下解决方案适用于 LO Calc。如果数据在A1到A15中,则在B1中输入以下公式。
=IF(LEN($A1)<COLUMN()-1;-1;IF(CODE(MID($A1;COLUMN()-1;1))<=CODE(9);MID($A1;COLUMN()-1;1)+27;CODE(MID($A1;COLUMN()-1;1))-CODE("A")))
获取A1中字符串的第一个字符,然后确定该字符的排序值,"A"变为0(排序顺序中的第一个),“9”变为36(最后一个)排序顺序)。
现在,将字符串中的其余字符拖动并填充到 J15,然后将其他字符串向下拖动到 J15。
然后,转到数据 -> 排序。排序键 1 是列 B,排序键 2 是列 C,依此类推到 J。
或者,select A1 到 A15,然后 运行 以下 Python macro。
import uno
def custom_sort():
oSelect = XSCRIPTCONTEXT.getDocument().getCurrentSelection()
rowTuples = oSelect.getDataArray()
rowTuples = sorted(rowTuples, key=letters_then_numbers)
oSelect.setDataArray(rowTuples)
def letters_then_numbers(rowTuple):
strval = str(rowTuple[0])
sresult = ""
for c in strval:
if c in (str(i) for i in range(10)): # if character is a number
c = chr(ord('z') + int(c)) # then order it after z
sresult += c
return sresult
g_exportedScripts = custom_sort,