我想要按摩一些非常难看的数据。它由SKU组成,我想将它们分组到产品线中。 E.g:
PRODUCT_ID
----------
313L30WHITE
313L40WHITE
313L30BLACK
3333
2L10RED
2L20BLACK
32341/30/BLK
基本上,我想按PRODUCT_ID
字段中的第一个数字字符对项目进行分组。即,所有字符直到第一个非数字字符。 E.g:
PRODUCT_ID GROUP
---------- -----
313L30WHITE 313
313L40WHITE 313
313L30BLACK 313
3333 3333
2L10RED 2
2L20BLACK 2
32341/30/BLK 32341
似乎SQL解决方案不会优雅。因此,我更喜欢使用新的GROUP
列创建新表的Python解决方案。
有人有什么建议吗?
答案 0 :(得分:3)
如果您知道PRODUCT_ID
将始终开始并带有一个或多个数字字符,那么您只需添加0
即可将其转换为数字:
select PRODUCT_ID,
0 + PRODUCT_ID as GROUP
from ...
请参阅§11.2 "Type Conversion in Expression Evaluation" in the MySQL 5.6 Reference Manual。
如果您希望GROUP
是文本而不是数字,那么您可以写:
select PRODUCT_ID,
concat(0 + PRODUCT_ID) as GROUP
from ...
答案 1 :(得分:2)
这是正则表达式的理想场所......
import re
RE=re.compile(r'\d+')
#Set up the list of SKU's
...
List_of_SKUs.sort(key=lambda x:int(RE.match(x).group()))
现在您的列表已排序。
正则表达式只是拉出字符串开头的最长整数。 lambda
函数只访问字符串的那一部分并将其强制转换为用于排序的整数。
修改强>
从那里,如果你想打印表格,你可以做类似的事情:
for item in List_of_SKUs:
print "%s\t%s"%(item,RE.match(item).group())
虽然可能有更有效的方法。