ChatGPT解决这个技术问题 Extra ChatGPT

使用 LOAD DATA INFILE 从 CSV 文件导入 MySQL 中的数据

我正在将 20,000 行的一些数据从 CSV 文件导入 MySQL。

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

当我执行

LOAD DATA INFILE 'abc.csv' INTO TABLE abc

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

将数据导入 MySQL 的自动语法是什么?

它发生在我身上,我发现文本文件是用 '\r' 终止的行编写的,我试图导入数据,期望这些行使用 '\n' 终止
我为 load csv data into mysqlsyntax generator tool in Excel 编写了大量教程。应该对读者有用。
任何现有答案是否真正回答了“CSV 文件中的列与 MySQL 表的列的顺序不同。如何自动分配与 MySQL 表列对应的列?”这个问题?相反,他们似乎都回答了问题标题中更普遍的问题。或者,这个问题是不合逻辑还是不清楚?

P
Peter Mortensen

您可以使用 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 documentation 覆盖它。请注意,这样的覆盖并不能解决安全问题,而只是承认您知道并愿意承担风险。


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

您可能需要设置 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,则访问被拒绝。
P
Peter Mortensen

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

将文件中的数据导入到的数据库表。

一个 CSV 文件,其数据与表的列数和每列中的数据类型相匹配。

连接到 MySQL 数据库服务器的帐户具有 FILE 和 INSERT 权限。

假设我们有下表:

https://i.stack.imgur.com/d3Rh9.png

使用以下查询创建表:

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 文件必须正确格式化。例如,请参阅以下附加图像:

https://i.stack.imgur.com/ktAIW.png

如果一切正常,请执行以下查询以从 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 文件是否对每一列都有正确的数据类型,因为默认情况下它会忽略无效的数据类型。
P
Peter Mortensen

句法:

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;

在 Windows 上,大概?它是用什么版本的 MySQL 测试的?什么版本的 Windows?
P
Peter Mortensen

1分钟内在数据库中批量插入超过7,000,000条记录(带计算的超快速查询):

    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 文件中,但我们正在计算它们并在之后插入它们。


问题中不要求即时计算。
我们提供额外的,没有错误的知识。
P
Peter Mortensen

如果您从 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

什么Windows外壳? CMDPowerShell(2006 年首次推出)?
P
Peter Mortensen

假设您正在使用 XAMPPphpMyAdmin

您有文件名“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;

如果您在 localhost 上执行此操作,这可能会起作用。


P
Peter Mortensen

到现在(2019 年底),我更喜欢使用像 Convert CSV to SQL 这样的工具。

如果您有很多行,当 CSV 来自最终用户电子表格时,您可以运行分区块来保存用户错误。


Notepad++ 有一个 CSV Lint 插件,可以做同样的事情github.com/BdR76/CSVLint
P
Peter Mortensen

您可以从 CSV 或文本文件加载数据。

如果您有一个包含表中记录的文本文件,您可以在表中加载这些记录。

例如,如果您有一个文本文件,其中每一行都是包含每列值的记录,您可以通过这种方式加载记录。

文件表.sql

id //field 1

name //field2

文件表.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';

是的,但问题是关于 CSV -“使用 LOAD DATA INFILE 从 CSV 文件导入 MySQL 中的数据”
P
Peter Mortensen

您可以尝试像这样插入:

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

最后一部分“(field1,field2,field3)”与大多数其他答案不同。一个解释将是有序的。例如,想法/要点是什么?来自 the Help Center“...总是解释为什么你提出的解决方案是合适的以及它是如何工作的”。请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的)。
A
Abhijit Das

编辑 my.ini 文件并在 [mysqld] 部分下添加以下secure-file-priv = ""。此外,如果已经为此设置了任何变量,则将其删除。然后重启 MySQL 服务,执行如下命令,查看值是否修改成功: SHOW VARIABLES LIKE "secure_file_priv";然后你可以在安装的 MySQL 系统中执行以下查询并导入数据, LOAD DATA INFILE "csv file location" INTO TABLE tablename FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (column1,column2,. ....);注意:(根据 csv 文件,列名用逗号分隔)要从任何其他远程系统添加任何 CSV 文件,您还可以在上述步骤之后执行以下操作:显示全局变量,如 'local_infile'; -- 注意:如果值为OFF,则执行下面的下一条命令 set global local_infile=true; -- 再次检查该值是否已设置为 ON 执行以下命令从任何其他系统的 CSV 文件导入数据, LOAD DATA LOCAL INFILE "csv file location" INTO TABLE tablename FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (column1,column2,.....); -- 按 csv 文件用逗号分隔的列名


如果你用代码标签包装你的代码会很有用。
感谢@Jairus 的建议将进一步使用代码标签。
P
Peter Mortensen

我得到

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

这在使用 WAMP Server 3.0.6 64 位的 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 (最后一个目录是我的数据库名称)

我执行了 LOAD DATA INFILE 'myfile.csv' INTO TABLE alumnos FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES

......瞧!