【问题标题】:Load csv file into mysql database将csv文件加载到mysql数据库中
【发布时间】:2016-04-17 07:46:33
【问题描述】:

我正在尝试将一个大的 CSV 文件加载到 mysql 中,但找不到失败的原因。

我的 CSV 文件如下所示:

_id,"event","unit","created","r1","r2","r3","r4","space_id","owner_id","name","display_name","users__email"
565ce313819709476d7eaf0e,"create",3066,"2015-12-01T00:00:19.604Z","563f592dd6f47ae719be8b38","3","13","7","55ecdd4ea970e6665f7e3911","55e6e3f0a856461404a60fc1","household","household","foo.bar@ace.com"
565ce350819709476d7eaf0f,"complete",3067,"2015-12-01T00:01:19.988Z","21","","","","55e6df3ba856461404a5fdc9","55e6e3f0a856461404a60fc1","Ace","Base","foo.bar@ace.com"
565ce350819709476d7eaf0f,"delete",3067,"2015-12-01T00:01:19.988Z","21","","","","55e6df3ba856461404a5fdc9","55e6e3f0a856461404a60fc1","Ace","Base","foo.bar@ace.com"
565ce350819709476d7eaf0f,"update",3067,"2015-12-01T00:01:19.988Z","21","","","","55e6df3ba856461404a5fdc9","55e6e3f0a856461404a60fc1","Ace","Base","foo.bar@ace.com"

我将文件加载到 mysql 的代码是这样的:

CREATE DATABASE IF NOT EXISTS analys;

USE analys;

CREATE TABLE IF NOT EXISTS event_log (
  _id CHAR(24) NOT NULL,
  event_log VARCHAR(255),
  unit CHAR(4),
  created VARCHAR(255),
  r1 VARCHAR(255),
  r2 VARCHAR(255),
  r3 VARCHAR(255),
  r4 VARCHAR(255),
  space_id VARCHAR(255),
  owner_id VARCHAR(255),
  name VARCHAR(255),
  display_name VARCHAR(255),
  users__email VARCHAR(255),
  PRIMARY KEY (_id)
)

LOAD DATA INFILE 'audits.export.csv' 
INTO TABLE event_log
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n\r'
IGNORE 1 ROWS;

一切都很好,包括查询,但我在每一列(只有一行)中得到 NULL

这是动作输出:

22:31:21    LOAD DATA INFILE 'audits.export.csv'  INTO TABLE event_log FIELDS TERMINATED BY ','  ENCLOSED BY '"' LINES TERMINATED BY '\n\r' IGNORE 1 ROWS   0 row(s) affected Records: 0  Deleted: 0  Skipped: 0  Warnings: 0   0.156 sec

我试图调整表和负载查询,但它不起作用

我在 Windows 7 上,使用 Mysql 5.6 和 Workbench。 我在这里 (Excel Connector) 听说过 GUI 解决方案或 Excel 连接器,但我更喜欢以编程方式进行,因为我需要重用代码。

有什么帮助吗?我无法通过 Stackoverflow 上的类似帖子解决问题。

【问题讨论】:

  • 可能是数据问题,也可能是格式问题 ....取其中一行并尝试使用 insert into blah values ("Ace","Base","foo .bar@ace.com") .... 并将其作为调试过程的一部分。使用“mysql workbench”之类的
  • 检查你的文件不是一行......因此,你说的是 LINES TERMINATED BY '\n\r' .... 你可以这样做:cat -vet filename.csv
  • 我在 windows 上并且 cat -vet 不起作用

标签: mysql csv mysql-workbench workbench mysqlimport


【解决方案1】:

这似乎不是一个有效的换行符:

LINES TERMINATED BY '\n\r'

改为:

LINES TERMINATED BY '\r\n'

或仅其中一个(可能是单个 \n\r,具体取决于系统或创建 csv 文件的软件)。

【讨论】:

  • 相同。我调整了代码,尤其是这部分,因为编码可以在 Unix 或 Windows 上完成,但它没有改变任何东西。很好的查询,但有 0 行受到影响
  • @Synleb - 奇怪。我认为文件名也正确吗?即审核后不需要斜杠/反斜杠(或完整路径)?
  • @Synleb - 我不知道您的真实数据是否属于这种情况,但主键字段包含重复值。
  • 路径是正确的,我尝试使用 bavkslash。它不会改变任何东西。对于副本,实际数据中并非如此。我复制粘贴了第二行。
  • 只有我提供的四行(_id 上没有重复项)我得到另一个错误:错误代码:1261。第 1 行不包含所有列的数据跨度>
【解决方案2】:

因为有些人可能会想知道如何使用 MySQL Workbench 来做到这一点:

  1. 将 CSV 数据保存到文件,例如 foo.csv
  2. 打开 MySQL 工作台
  3. 选择/打开 MySQL 连接
  4. 右键单击对象浏览器中的架构(左侧导航器)
  5. 选择“表数据导入向导”
  6. 选择 CSV 文件,在我们的示例中为 foo.csv
  7. 跟随向导;许多配置选项可用,包括分隔符
  8. 完成后,CSV 数据将位于新表或现有表中(由您选择)

有关更多信息,请参阅标题为 Table Data Export and Import Wizard 的文档。

我刚刚在问题中提供的示例数据中对此进行了测试,并且成功了。

【讨论】:

  • 谢谢@Philip。但我更喜欢基于代码的解决方案而不是 GUI 解决方案,因为我想在脚本中实现加载。我知道问题是双引号,但我不知道为什么双引号是我在负载查询中的参数之一
猜你喜欢
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多