phpmyadmin (CSV) 中的 MySQL 导入阻塞引号

Posted

技术标签:

【中文标题】phpmyadmin (CSV) 中的 MySQL 导入阻塞引号【英文标题】:MySQL import in phpmyadmin (CSV) chokes on quotes 【发布时间】:2010-11-06 02:21:10 【问题描述】:

我正在尝试通过 phpMyAdmin.csv 文件 导入 mysql 表。

.csv 文件由管道分隔,格式如下:

数据|d'ata|d'a"ta|dat"a| 数据|“da”ta|数据|da't'a| 数据|数据|数据“数据”|数据|

数据包含引号。我无法控制接收数据的格式——它是由第三方生成的。

当有 | 时问题就来了后跟双引号。我总是收到“第 N 行 CSV 输入中的无效字段计数”错误。

我正在从导入页面上传文件,使用 Latin1,CSV,以 | 结尾,以“分隔。

我只想更改“被包围”字符,但我不断收到“CSV 导入的无效参数:被包围的字段”。我尝试了各种角色都没有成功。

如何让 MySQL 在 phpMyAdmin 中接受这种格式?

设置这些表是编写程序的第一步,该程序将使用上传的 gzip 压缩 .csv 文件来维护电子商务网站的目录。

【问题讨论】:

【参考方案1】:

在过去的几个小时里我一直遇到类似的问题,我终于得到了一个导入工作,所以我会分享我的解决方案,即使它可能对原始海报没有帮助。

短版: 1.) 如果是 Excel 文件,另存为 ODS(打开文档电子表格)格式。 1a。)如果文件是某种带有分隔符的文本格式(如原始海报中的那样),则打开 Excel,一旦在 Excel 中使用 File/Open 打开文件。在那里,您将能够选择适当的分隔符来查看文件。确保文件看起来没问题,然后保存为 ODS 格式(并关闭文件)。

2.) 在 OpenOffice Calc 中打开文件(从 Oracle/Sun 免费下载)。

2a.) 按 Ctrl-F 打开“查找”对话框。单击更多选项并确保未选中“仅当前选择”。

2b.) 搜索双引号。如果您的文件中没有,您可以跳过第 4 步和第 5 步。

3.) 另存为 -> 文本 CSV。选择UTF-8格式的选项(按“u”3次快速到达那里),选择“;” (分号)作为分隔符,文本选择双引号。

4.) 如果在步骤 2b 中在您的文件中发现任何双引号,请继续,否则只需使用 phpMyAdmin 将文件导入为 CSV(参见步骤 6)。它应该可以工作。

5a.) 在 Word 或任何其他可以执行查找 -> 全部替换的文本编辑器中打开。

5b.) 通过搜索 """ 在一行中找到所有三个双引号的实例(如果您确实找到了,您甚至可能想要连续搜索 4、5、6 等,直到找到空)。

5c.) 将 """ 替换为 csv 中其他任何地方都找不到的占位符。我将它们替换为 'abcdefg'。

5d.) 查找 -> 将 ""(连续两个双引号)的所有实例替换为 "(正斜杠和双引号)。

5e.) 查找 -> 将 abcdefg 的所有实例(或您在步骤 5c 中选择的占位符)替换为“”。 5c 和此步骤确保在文本分隔引号之前出现在字段末尾的任何引号都被正确“转义”。

5f.) 最后,保存文件,保存为 UTF-8(或导入所需的任何格式)。

6.a) 在phpMyAdmin中,点击“导入”选项卡,点击“选择文件”按钮,选择刚才保存的文件。

6b.) 应选择“导入文件的格式”下的 CSV。如果列名在第一行,请确保选中该复选框。最重要的是,“字段终止于”应设置为 ; (分号),“被包围的字段”应设置为“(双引号),并且“被转义的字段”应设置为 \(正斜杠)。您按照步骤 3 在文件中进行设置,如果按照步骤 5a - 5f 进行操作。

7.) 点击“开始”并祈祷您没有再浪费一个小时。

既然短版已经这么长了,我会跳过长版。

可以这么说,通过 phpmyadmin 导入似乎存在 2 个主要问题。 1.) 存在某种内存问题,阻止导入大型 Excel 和 ODS 文件(有多大?还不确定)。 2.) OpenOffice 和 Excel 似乎都没有以与 phpmyadmin 兼容的方式保存它们的 csv 文件。他们想用双引号转义双引号。 phpMyAdmin 希望用其他东西转义双引号,例如正斜杠。

第一个问题有望在 phpmyadmin(和/或 Excel 导入插件“PHPExcel”)的更新中得到解决。 如果有一种简单的方法可以更改保存为 CSV 的 Excel 或 ODS 文件的转义字符,或者可以使 phpMyAdmin 与它们的格式兼容(这实际上应该很容易。只需让它执行相同的操作,就可以修复第二个问题我们在上面手动执行的查找-替换操作以避开双引号问题)。

我希望这对某人有所帮助,因为我花了 3 到 4 个小时来发现这个解决方案,然后又在这里写了一个小时。我希望它不会太长,但我希望能帮助所有专业水平的人,从零到我所在的任何地方(可能在 0.1 左右)。

【讨论】:

【参考方案2】:

我发现了一个有效的技巧——我使用 $ 作为“封闭”字符,一切都很好。由于这是针对欧洲站点的,我知道他们永远不会在表格内容中使用它。

【讨论】:

【参考方案3】:

您可以通过在每个 ' 前面添加一个 \ 来修改 csv 文件,对吗?

【讨论】:

我无法修改传入的文件 您提到您将使用上传的 gzipped csv 文件,对吗?我认为这是一个自动化过程,对吗?你可以解压它,修复它,然后导入它,对吗? (但是,可能有点过头了,但我猜它有效)【参考方案4】:

您是否尝试过将“包含的字段”和“转义的字段”的框清空?我没用过phpMyAdmin,但谷歌建议others have had success with this method。

【讨论】:

我试过了,得到了 g“CSV 导入的无效参数:包含的字段”。【参考方案5】:

您可能会考虑只编写自己的 LOAD DATA INFILE 查询,似乎无论如何您都需要一个查询,因为此过程将在某个时候成为应用程序的一部分。

【讨论】:

确实如此,但我仍在与提供者一起制定表结构。只要表结构尚未最终确定,我就想避免编写代码。使用 phpMyAdmin 导入可以让我快速查看我的表结构是否与收到的文件匹配。

以上是关于phpmyadmin (CSV) 中的 MySQL 导入阻塞引号的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CSV 导入 phpMyAdmin?

每个逗号分隔的 CSV 值到 PhpMyadmin 中的新行

通过phpmyadmin将csv文件导入mysql

如何通过 phpmyadmin 将 csv 文件导入 mysql

使用 phpMyAdmin 从 mySQL 自动导出 CSV

无法使用 phpmyadmin 向导将 csv 导入 mysql 数据库