分隔字符串

时间:2016-01-14 09:41:57

标签: php mysql

如何分隔字符串中的多个元素?

我正在努力将遗留数据库中的信息传输到新表中。旧表中的一列包含一个长字符串,其中包含多个标题。

有成千上万的此类记录。我知道如何使用php / mysql循环遍历列中包含的每个字符串。但是,我不知道如何在字符串中的每个标题下面提取数据,将其内容放在新列中。

请注意,每个记录的标题都相同 即

第一部分,

第二部分。

所以,我基本上需要提取第一部分下面的数据并放在它自己的列中,并对其他部分做同样的事情。

  

第一节?

     

我喜欢与人交流并将其调整到周围的环境

     

第二部分?

     

所以他们会得到正确的指导来解决他们周围的问题   鼓励和激励。

     

第三节?
     我相信每一次阅读都应该是令人振奋和积极的,当有人有这种感觉时,

     

第四节?

     

当我在2004年1月为Facebook编写第一个代码时,我希望它可以帮助我大学的学生联系并将我们的社区聚集在一起。

更新 - 我附上表格

LEGACY TABLE

这是从中提取数据的表格; 我们将从个人资料

中提取信息
CREATE TABLE IF NOT EXISTS `readers` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `profile` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1778 ;

NEW TABLE

这是数据将转到的表。有6列。所以第一部分的数据将进入第一栏等。

CREATE TABLE IF NOT EXISTS `reader_personal_details` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question1` longtext COLLATE utf8_unicode_ci,
  `question2` longtext COLLATE utf8_unicode_ci,
  `question3` longtext COLLATE utf8_unicode_ci,
  `question4` longtext COLLATE utf8_unicode_ci,
  `question5` longtext COLLATE utf8_unicode_ci,
  `question6` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

更新两次; 我只是注意到标题包含在HTML CODE中。这会对答案产生影响吗?

<p><strong>Section One?</strong></p>

<p><strong>i enjoy connecting with people and turning into what is around them ?</strong></p>

1 个答案:

答案 0 :(得分:0)

SQL中的一种可能的解决方案。不是100%满意。

按顺序设置一个包含所有标题的表格(即,ID按照它们出现的顺序,或者使用单独的订单字段)

然后用两次加入你的数据表,一次获得标题,一次获得存在的下一个标题(使用MIN)。

将此作为子查询使用,并与您的表联接以实际从您的字段中提取值。

请注意,如果重复标题(例如,如果标题也出现在文本中),这将无法正常工作。

SELECT z.id, y.id, SUBSTRING_INDEX(COALESCE(SUBSTRING_INDEX(z.full_field, x.section_name, 1), z.full_field), y.section_name, -1)
FROM some_table z
INNER JOIN
(
    SELECT a.id AS some_id, b.id AS first_header_id, MIN(c.id) AS second_header_id
    FROM some_table a
    INNER JOIN sections b ON INSTR(a.full_field, b.section_name) > 0
    LEFT OUTER JOIN sections c ON c.id > b.id
    GROUP BY some_id, first_header_id 
) sub0
ON z.id = sub0.some_id
INNER JOIN sections y ON y.id = sub0.first_header_id
LEFT OUTER JOIN sections x ON x.id = sub0.second_header_id

我用下表测试了它: -

CREATE TABLE sections
(
    id  INT,
    section_name    VARCHAR(255)
);

INSERT INTO sections VALUES
(1, 'section One?'),
(2, 'Section Two?'),
(3, 'Section Three?'),
(4, 'Section four ?');


CREATE TABLE some_table
(
    id  INT,
    full_field  TEXT
);

INSERT INTO some_table VALUES
(1, 'section One?

I enjoy connecting with people and tuning it to what is around them

Section Two?

so they receive the right guidance to resolve issues around them and to encourage and inspire.

Section Three?
I believe that every reading should be uplifting and positive and when someone feels that,

Section four ?

When I wrote the first code for Facebook in January 2004, I hoped it would help students at my college connect and bring our community together.');

修改

如果您只想输出到固定列并且分隔符已修复,那么它应该相当简单,如下所示: -

INSERT INTO reader_personal_details (`id`, `question1`, `question2`, `question3`, `question4`, `question5`, `question6`)
SELECT id,
        SUBSTRING_INDEX(SUBSTRING_INDEX(profile, 'Section Two?', 1), 'section One?', -1),
        SUBSTRING_INDEX(SUBSTRING_INDEX(profile, 'Section Three?', 1), 'section Two?', -1),
        SUBSTRING_INDEX(SUBSTRING_INDEX(profile, 'Section four ?', 1), 'Section Three?', -1),
        SUBSTRING_INDEX(SUBSTRING_INDEX(profile, 'Section Five?', 1), 'Section four ?', -1),
        SUBSTRING_INDEX(SUBSTRING_INDEX(profile, 'Section Six?', 1), 'section Five?', -1),
        SUBSTRING_INDEX(profile, 'section Six?', -1)
FROM readers