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 导入数据