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


106

我正在从CSV文件将20000行的某些数据导入Mysql。

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

当我执行

LOAD DATA INFILE'abc.csv' INTO TABLE abc

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

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



它发生在我身上,我发现文本文件是用'\ r'终止的行编写的,而我试图导入数据时期望使用'\ n'终止这些行
Tamer

2
我编写了广泛的教程,将csv数据Excel中语法生成器工具一起加载到mysql 。对读者应该有用。
mysql_user

Answers:


169

您可以使用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关键字hold安全风险,从MySQL 8.0开始,该LOCAL功能False默认设置为。您可能会看到错误:

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

您可以按照docs中说明将其覆盖。注意,这种覆盖并不能解决安全问题,而只是承认您知道并愿意承担风险。


1
我可以知道IGNORE 1 LINES这里到底是什么吗?提前致谢。
库什克·达斯

5
@KoushikDas它将忽略定义列名称的第一行
Saharsh Shah

28
警告:LINES TERMINATED BY'\ r \ n'子句适用于Windows文件,但linux文件应仅具有'\ n'。
ChuckCottrill

1
重要的是要记住使用正斜杠:stackoverflow.com/a/42878067/470749
Ryan

3
请注意,不需要(col1,col2,col3 ....)。如果要在使用此表插入数据之前快速创建表,则很有用。
基兰·奎因

51

您可能需要设置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;

1
LOAD DATA LOCAL INFILE ...如果没有LOCAL,则拒绝访问。
ketankk '18年

49

导入文件之前,您必须准备以下内容:

  • 数据库表,文件中的数据将导入到该数据库表中。
  • 一个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文件是否对每一列都有正确的数据类型,因为默认情况下它会忽略无效的数据类型。
Umar Abbas

2
很抱歉打扰这么旧的答案。这很有说服力,但是我该如何跳过一些领域。假设我的表格有projectId,surveyId和dateTime,如何跳过“视图”字段?
丹麦的Ansari,

@MD丹麦人Ansari,很抱歉回答一个老问题,但您可以指定表格列。我做了以下操作,需要跳过第一个字段(自动增量主键)以及其他一些字段:LOAD DATA LOCAL INFILE'C:\\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics。 csv'插入表my_log_tbl字段以','封闭'''以'\ r \ n'终止的行(UserId,CustomerId,InstitutionId,ApplicationId,FullURL,AccessTimeStamp,IPaddress);我以为列应该在表的名字,但没有工作,他们应该出现在年底。
kalinma

17

句法:

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;

10

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

mysqli_query($cons, '
    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,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP和RRP_nl和RRP_bl不在csv中,但我们会对其进行计算,然后将其插入。


2

如果您是LOAD DATA LOCAL INFILE从Windows Shell 运行,并且需要使用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

2

假设您正在使用xampp和phpmyadmin

您有文件名“ ratings.txt”,表名“ ratings”和数据库名“ movies”

如果您的xampp安装在“ C:\ xampp \”中

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

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

希望如果您在localhost上执行此操作,可以帮助您忽略错误


0

您可以从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'; 

0

我收到错误代码: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 \(或此处的任何目录)

停止一切(退出沼泽等),然后重新开始一切;然后在C:\ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur(最后一个目录是我的数据库名称)上平移我的cvs文件

执行LOAD DATA INFILE'myfile.csv'

入表铝

以','结尾的字段

封闭在“”

'\ r \ n'终止的行

忽略1行

...还有VOILA !!!


0

您可以尝试这样插入:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.