如何将多行csv功能加载到MySQL中

问题描述 投票:0回答:2

我正在尝试将 .csv 文件加载到我的 SQL 表中,但其中一列有多行数据,并且由于某种原因 SQL 不喜欢这样。我附上了我的数据的图片,如下所示,我使用以下命令加载数据:

load data local infile 'Users/.../info.csv'
into table spell_info fields terminated by ','
enclosed by ' ' lines terminated by '\n';

由于某种原因,它只加载第一行,基本上它似乎只是弹出第一个项目。它给我的回应是

1 行受影响,1 条警告:1265 列数据被截断 'spellInfo' 在第 1 行 记录:1 删除:0 跳过:0 警告:1

任何帮助表示赞赏。我不确定这是否是 csv 文件中信息的列出方式,或者是否是我的命令,或者两者的某种组合。

mysql sql csv load-data-infile
2个回答
1
投票

如果要导入的文件每条记录使用多行,那么如何正确导入数据有很多变体。我将描述其中的 2 个。

变体 1.

文件被加载到下一个结构的临时表中:

CREATE TEMPORARY TABLE tmp (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    raw_data TEXT
);

文件被加载到该表中,整行被导入到一列中。喜欢

LOAD DATA INFILE 'filename.ext'
INTO TABLE tmp
FIELDS TERMINATED BY ''        -- or use terminating char which is absent in the file
LINES TERMINATED BY '\n'       -- use correct lines terminator
(raw_data);

自动增量列根据加载顺序枚举行,即根据它们在文件中的所有权。

数据加载后,您可以处理该数据并将数据保存到工作表中。如果每条记录的行数是静态的,那么您可以按

(id - 1) MOD @rows_per_record
对 temptable 中的行进行分组,并从组中的确定行中提取每个单独的列。或者您可以按
t1.id = t2.id-1 = t3.id-2 = .. AND (tN.id MOD @rows_per_record)=0
加入相应数量的行。如果记录数据可能占用可变数量的行,则递归 CTE 或迭代过程可能是唯一的选择。

变体 2.

您以相同的方式使用

LOAD DATA
进行输入预处理,但将整行加载到用户定义的变量中。在 SET 子句中,您将加载的值连接到上一行加载中保存的值(在另一个变量中),并检查该行是否完整。如果是这样,那么您提取值并将它们保存到列中,并清除收集数据的变量,如果不是,那么您用假的但正确的值填充列。加载文件后,您只需删除具有假值的行即可。


如果文件不大,那么您可以将整个文件加载到一个用户定义的变量中(使用

LOAD_FILE()
函数),然后将其解析为单独的记录和列。


0
投票

如果您的多行列是“注释”。

@notes 变量用于初始加载多行“注释”字段。

LOAD DATA INFILE '/path/to/yourfile.csv'
INTO TABLE your_table_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(title, @notes)
SET notes = REPLACE(@notes, '\\n', '\n');

SET 注释 = REPLACE(@notes, ' ',' ');部分是一个示例,可能需要调整。它旨在展示如何处理 CSV 中转义的换行符。但是,如果您的 CSV 不在字段中使用转义换行符,则可能不需要此步骤。

© www.soinside.com 2019 - 2024. All rights reserved.