解析MySQL列以提取数据

26 浏览
0 Comments

解析MySQL列以提取数据

在一个数字化的1950年代汽车零件手册的版本上,模型条目被设计成人眼可读,以节省空间而进行了缩写。当然,这在我的搜索引擎上是行不通的,而且我对正则表达式知之甚少,对REGEXP更是一无所知,所以我希望这里有人可以帮助。我确实查阅了MySQL手册,但恐怕没有这样的内容。还有其他变种的数据,但我想先从这一部分开始。我目前正在使用一个需要数小时才能运行的PHP脚本进行解析,尽管只有在有更新数据时才需要运行,但它所需的时间实在太长了。

以下是以一个单行字段的形式呈现的数据,以分号分隔(注意:原始数据中这些内容在一行上,但我在这里添加了换行以便更容易阅读):

2452-62-65-67-72-92-95-98; 
2552-62-65-72-77-92-95; 
2650-51-52-62-65-72-77-92-95-97; 
5450-51-52-62-65-67-72-77-82-85-92-95-97

... 需要解析的部分始终包含连字符,但我需要它们以某种方式解析出来,看起来像这样。它需要忽略任何文本,因为有些文本会单独发布,例如ALL 24TH; 25TH; 26TH:

2452 2462 2465 2467 2472 2492 2495 2498; 
2552 2562 2565 2572 2577 2592 2595; 
2650 2651 2652 2662 2665 2672 2677 2692 2695 2697; 
5450 5451 5452 5462 5465 5467 5472 5477 5482 5485 5492 5495 5497

这个简单的查询将检索出四位数,但我不知道如何继续。

SELECT
    Models 
FROM
    parts_listing
WHERE
     Models REGEXP '^[0-9]{4}$'
ORDER BY Models;

下面是一个基本行或给定零件的模型分组的较短示例:

2206-13-26-33; 2302-06-13-32-33

... 但是该行还可能包含其他信息(我最终需要解析),如以下示例所示。对于第一和第二个示例,我们需要解析出ALL和序数,对于第三个示例,我们需要解析出括号之间的所有内容。第四个示例以ALL值开头和结尾,但在中间有一些以连字符分隔的值。

ALL 24TH; 25TH; 26TH
2262-65-70-71-72-75-76-77-79-80-82-86-92-93-95; ALL 23RD
5401-11-31 (BODIES 5467-77-97)
ALL 22ND; 2301-02-13-32; ALL 24TH; 25TH; 26TH; 54TH

还有一些带有LHD(或有时是RHD)的内容,可能在行的开头或其他位置,并且总是在其后有一个逗号:

LHD, 2401 (BODIES 2462-65-92-95-98); 2501; 2601-33; 5400-33

可能还有其他变种,但目前我只关注基本的模型信息。

0
0 Comments

标题:从MySQL列中解析数据的问题及解决方法

问题的出现原因:

- 在原始问题中,使用的查询语句只能解析出第一个分号之前的部分数据,而无法解析出其他分号后的数据。

解决方法:

- 通过使用正则表达式来过滤掉括号内的内容以及序数词。

- 修改查询语句中的正则表达式,使用replace函数替换掉括号内的内容,以及分号。

- 通过添加额外的子查询,将原始数据按照分号进行拆分,然后使用replace函数替换掉不需要的部分。

- 将修改后的数据进行拼接,得到最终的结果。

示例代码:

select  
  group_concat(
    replace(t.part, '-', concat(' ', left(t.part, 2)))
    order by t.partno
    separator ' '                                      
  ) Models
from (
  select t.Models, p.partno,
    replace(replace(
      substring_index(t.Models, ';', p.partno),
      substring_index(t.Models, ';', p.partno - 1),
      ''
    ), ';', '') part 
  from parts_listing t cross join (
    select 1 partno union all select 2 union all select 3 union all
    select 4 union all select 5 union all select 6 union all
    select 7 union all select 8 union all select 9
  ) p 
  where replace(replace(Models, '-', ''), ';', '') regexp'^[0-9]*$'
) t
where t.part <> ''
group by t.Models
order by t.Models 

以上是原始问题的出现原因及解决方法的整理。通过使用正则表达式和字符串替换函数,可以解析出MySQL列中的数据。

0