如何将多行 csv 特征加载到 MySQL

How to load multiline csv feature into MySQL

我正在尝试将 .csv 文件加载到我的 SQL table 中,但是其中一列包含多行数据,并且出于某种原因 SQL 没有不喜欢那样。我在下面附上了我的数据的图片,我正在使用以下命令将数据加载到:

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

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

1 row(s) affected, 1 warning(s): 1265 Data truncated for column 'spellInfo' at row 1 Records: 1 Deleted: 0 Skipped: 0 Warnings: 1

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

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

变体 1.

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

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

文件加载到这个table,整行导入到一列。喜欢

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);

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

加载数据后,您可以处理此数据并将数据保存到工作中table。如果每条记录的行数是静态的,那么您可以将 temptable 中的行按 (id - 1) MOD @rows_per_record 分组,并从组中的确定行中提取每个单独的列。或者您可以按 t1.id = t2.id-1 = t3.id-2 = .. AND (tN.id MOD @rows_per_record)=0 根据行数加入。如果记录数据可能占用可变数量的行,那么递归 CTE 或迭代过程可能是唯一的选择。

变体 2.

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


如果文件不大,那么您可以将整个文件加载到一个 user-defined 变量中(使用 LOAD_FILE() 函数),然后将其解析为单独的记录和列。