MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据

Posted

技术标签:

【中文标题】MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据【英文标题】:Import data in MySQL from a CSV file using LOAD DATA INFILE 【发布时间】:2021-10-02 20:14:54 【问题描述】:

我正在将一些 20000 行的数据从 CSV 文件导入 mysql

CSV 中的列与 MySQL 表中的列的顺序不同。如何自动分配Mysql表列对应的列?

当我执行时

LOAD DATA INFILE'abc.csv' INTO TABLE abc

此查询将所有数据添加到第一列。

请建议将数据导入 Mysql 的自动语法。

【问题讨论】:

***.com/questions/11077801/import-csv-to-mysql-table/…有类似话题 它发生在我身上,我发现文本文件是用 '\r' 终止的行编写的,我试图导入数据,期望这些行使用 '\n' 终止 我向load csv data into mysql 和syntax generator tool in Excel 撰写了大量教程。它应该对读者有用。 【参考方案1】:

您可以使用LOAD DATA INFILE 命令将csv 文件导入到表中。

查看此链接MySQL - LOAD DATA INFILE

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

对于 MySQL 8.0 用户:

使用 LOCAL 关键字会带来安全风险,从 MySQL 8.0 开始,LOCAL 功能默认设置为 False。您可能会看到错误:

错误 1148:此 MySQL 版本不允许使用的命令

您可以按照instructions in the docs 覆盖它。 请注意,此类覆盖并不能解决安全问题,而只是承认您意识到并愿意承担风险。

【讨论】:

我可以知道IGNORE 1 LINES 究竟在这里做什么吗?提前致谢。 @KoushikDas 它将忽略定义列名的第一行 注意:LINES TERMINATED BY '\r\n' 子句适用于 windows 文件,但 linux 文件应该只有 '\n'。 重要的是要记住使用正斜杠:***.com/a/42878067/470749 请注意, (col1, col2, col3....) 不是必需的。如果您在使用它插入数据之前动态创建表,这很有用。【参考方案2】:

您可能需要设置FIELDS TERMINATED BY ',' 或任何分隔符。

对于 CSV 文件,您的语句应如下所示:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

【讨论】:

LOAD DATA LOCAL INFILE...如果没有 LOCAL,则访问被拒绝。【参考方案3】:

在导入文件之前,需要准备以下内容:

将文件中的数据导入到的数据库表。 一个 CSV 文件,其数据与 表和每列中的数据类型。 连接 MySQL 数据库服务器的账户有 FILE 和 INSERT 权限。

假设我们有下表:

使用以下查询创建表:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

您的 CSV 文件必须正确格式化,例如,请参见以下内容 附图:

如果一切正常。请执行以下查询以从 CSV 文件中加载数据:

注意:请添加 CSV 文件的绝对路径

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

如果一切都完成了。您已成功将数据从 CSV 导出到表格

【讨论】:

我们如何验证 CSV 文件的每一列是否具有正确的数据类型,因为默认情况下它会忽略无效的数据类型。 抱歉打扰了这么老的答案。这很有说服力,但我怎么能跳过一些领域。假设我的表有 projectId、surveyId 和 dateTime,我该如何跳过“views”字段? @MD 丹麦安萨里,很抱歉回答一个老问题,但您可以指定表格列。我做了以下操作,我需要跳过第一个字段(自动增量主键)以及其他一些字段: LOAD DATA LOCAL INFILE 'C:\\xampp\\htdocs\\data_files\\2018-10_statistics. csv' INTO TABLE my_log_tbl FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' (UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); 我原以为列应该在表名,但这不起作用。它们应该出现在最后。【参考方案4】:

语法:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [FIELDS | COLUMNS[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number LINES | ROWS]

看这个例子:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

【讨论】:

【参考方案5】:

在数据库中1分钟内批量插入超过7000000条记录(超快速查询和计算)

    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         ID = NULL

RRP 和 RRP_bl 不在 csv 中,但我们是在插入之后计算出来的。

【讨论】:

【参考方案6】:

如果您从 Windows shell 运行 LOAD DATA LOCAL INFILE,并且需要使用 OPTIONALLY ENCLOSED BY '"',则必须执行以下操作才能正确转义字符:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out

【讨论】:

【参考方案7】:

假设您使用的是 xampp 和 phpmyadmin

你有文件名 'ratings.txt' 表名 'ratings' 和数据库名 'movies'

如果你的 xampp 安装在 "C:\xampp\"

将“ratings.txt”文件复制到“C:\xampp\mysql\data\movies”文件夹中

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

如果您在本地主机上执行此操作,希望这可以帮助您省略错误

【讨论】:

【参考方案8】:

你可以尝试这样插入:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

【讨论】:

【参考方案9】:

到现在(2019 年底),我更喜欢使用像 http://www.convertcsv.com/csv-to-sql.htm 这样的工具 我有很多行,当 csv 来自最终用户电子表格时,您可以运行分区块来保存用户错误。

【讨论】:

Notepad++ 有一个 CSV Lint 插件可以做同样的事情github.com/BdR76/CSVLint【参考方案10】:

您可以从 csv 或文本文件加载数据。 如果您有一个包含表中记录的文本文件,则可以在表中加载这些记录。 例如,如果您有一个文本文件,其中每一行都是包含每列值的记录,您可以通过这种方式加载记录。

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--windows 上的示例

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 

【讨论】:

【参考方案11】:

我收到错误代码:1290。MySQL 服务器正在使用 --secure-file-priv 运行 选项,因此它无法执行此语句

这在使用 wampserver 3.0.6 64bit 的 windows 8.1 64 位上对我有用。

从 C:\wamp64\bin\mysql\mysql5.7.14 编辑 my.ini 文件

删除条目secure_file_priv c:\wamp64\tmp\(或您在此处拥有的任何目录)

停止一切 - 退出 wamp 等 - 并重新启动一切;然后将我的 cvs 文件放在 C:\wamp64\bin\mysql\mysql5.7.14\data\u242349266_recur (最后一个目录是我的数据库名称)

执行 加载数据文件'myfile.csv'

进入表校友

由','终止的字段

由'"'封闭

由“\r\n”终止的行

忽略 1 行

...然后瞧!!!

【讨论】:

以上是关于MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据

mysql load data infile

MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据

Mysql load data infile 效率问题

mysql导入数据load data infile用法整理

mysql导入数据load data infile用法