使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表

Posted

技术标签:

【中文标题】使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表【英文标题】:import tab separated csv file with partial data into mysql table with phpMyAdmin 【发布时间】:2014-12-13 21:44:37 【问题描述】:

我有一个大约 30 列的 mysql 表。 我有一个大约 10 列的 CSV 文件。

我想使用 phpMyAdmin 从数据库中的 CSV 文件更新数据,而不更改其余数据。

例如,MySQL 将是:

id, code,  name,     description, a,   b,   c,   x,  y,   z
10, rbmls, Joe Blow, Neighbor,    100, 200, 500, 80, 800, 10

CSV 可能包含:

id[TAB]code [TAB]a [TAB]b  [TAB]c
10[TAB]rbmls[TAB]10[TAB]300[TAB]0

我想通过 ID 匹配 CSV 和 MySQL 表中的数据,然后覆盖 MySQL 表中 CSV 中的数据,而不删除任何其他内容。

上述示例的预期结果是:

id, code, name, description, a, b, c, x, y, z
10, rbmls, Joe Blow, Neighbor, 10, 300, 0, 80, 800, 10

如何在 phpMyAdmin 中执行此操作?

【问题讨论】:

【参考方案1】:

LOAD DATA INFILE 在末尾有一个列规范。 see here

LOAD DATA INFILE ... 
INTO TABLE ... 
FIELDS TERMINATED BY '\t'
IGNORE 1 LINES
(id, code, a, b, c)

来自 MySQL-Doc:

默认情况下,当 LOAD DATA INFILE 语句末尾没有提供列列表时,输入行应包含每个表列的字段。如果您只想加载表的某些列,请指定列列表: LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

替代方案

将数据加载到临时表中,然后从那里向主表执行INSERT ... UPDATE。类似的东西:

LOAD DATA INFILE ... INTO TABLE `temp` ...

INSERT INTO mainTable (id, code, a, b, c)
SELECT * FROM `temp`
  ON DUPLICATE KEY UPDATE code=VALUES(code), a=VALUES(a), b=VALUES(b), c=VALUES(c);

见here

【讨论】:

我尝试了您的第一个解决方案,但似乎我做错了什么。我得到 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 'LINE (id, code, a, b, c) 附近使用正确的语法。 这是LINES 不是LINE,抱歉。我更新了我的答案。 谢谢,现在语法似乎是正确的,但我得到一个不同的错误:“#1045 - 访问被拒绝。”这似乎很奇怪,因为我已经登录到 phpMyAdmin 并且我只在尝试执行该语句时收到此消息。我使用托管解决方案,因此我无法完全访问配置文件。但是,我有一个面板来检查和更改我的权限,并且根据我所看到的,用户拥有执行我想做的事情的所有权利。有什么想法吗? 可能会拒绝访问您尝试加载的所需文件 好像就是这样。我需要把文件放在哪里?也许我只是把它放在了错误的位置。

以上是关于使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CSV 或制表符分隔文件映射到 MySQL 多表数据库

如何在pig中加载带有制表符和逗号的数据集

在 phpmyadmin 中导出带有批量数据的 mysql 表

将带有换行符的值导出到 Excel 中的单个单元格中。 jQuery 数据表

在 phpMyAdmin 中导入带有多边形数据的 CSV

带有大 SQL 导入错误的 PhpMyAdmin 超时