将 csv 逗号分隔值作为多行导入表中

Posted

技术标签:

【中文标题】将 csv 逗号分隔值作为多行导入表中【英文标题】:Import csv comma separated values into Table as multiple rows 【发布时间】:2020-06-02 07:06:52 【问题描述】:

我有一个看起来像这样的 .csv 文件:

test1; A,B
test2; B
test3; A,B,C

我想要的是这样的表格:

test1  A
test1  B
test2  B
test3  A
test3  B
test3  C

我已经取得的成就:

LOAD DATA LOCAL INFILE 'path.csv' 
INTO TABLE table1 
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
(col1, col2);

但它会跳过所有在第二个字段中有多个逗号分隔值的行...

很抱歉,如果这已经被问到了,但我几天来一直在努力寻找解决方案......

【问题讨论】:

负载数据无法处理。在加载之前修复数据(首选方法)或加载然后拆分。 你有一个 1:n 的关系并且想要“展开”成 1:1,但是在多行中。我同意@P.Salmon 的观点,您需要更改数据。我会用 perl、autoit3、python 或类似工具来做这件事。有趣的是,您是否曾经有重复的“testX”? 这看起来不像 csv 【参考方案1】:

考虑以下问题。部分原因是我仍在使用相当旧版本的 mysql,我有一个整数 (ints) 实用表,其值为 0-9...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(my_string VARCHAR(100) NOT NULL);

INSERT INTO my_table VALUES
('test1; A,B'),
('test2; B'),
('test3; A,B,C');

SELECT DISTINCT
       SUBSTRING_INDEX(my_string,';',1)  test
     , TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(my_string,';',-1),',',i+1),',',-1)) vals 
  FROM my_table
     , ints;

+-------+------+
| test  | vals |
+-------+------+
| test1 | A    |
| test2 | B    |
| test3 | A    |
| test1 | B    |
| test3 | B    |
| test3 | C    |
+-------+------+

【讨论】:

以上是关于将 csv 逗号分隔值作为多行导入表中的主要内容,如果未能解决你的问题,请参考以下文章

将多行转换为雪花中的一个逗号分隔值

将多行中的文本合并为一行(作为逗号分隔的字符串)

mysq

将逗号分隔的单元格拆分为多行,保持原始行不变?

获取逗号分隔值到informatica中的多行?

从临时表插入 - 创建太多行