【问题标题】:Importing Large csv (175 GB) to MySQL Server with Unusual Delimeters使用异常分隔符将大型 csv (175 GB) 导入 MySQL 服务器
【发布时间】:2026-02-10 17:15:01
【问题描述】:

我有一个 175 GB 的 csv,我正试图将其拉入 MySQL。

表格已设置并格式化。

问题是,csv 使用非正统的分隔符和行分隔符(都是 3 个字符串,@%@ 和 @^@)。

经过大量试验和错误后,我能够在 HeidiSQL 中启动该过程,但它会冻结并且实际上不会填充任何数据。

我希望使用 Python,但解析器只接受 1 个字符的行分隔符,这很棘手。

有没有人有任何关于让它工作的提示?

【问题讨论】:

  • “有没有人有任何关于让它工作的提示?”您需要编写自己的解析器来处理这个问题。
  • 可以上传文件到数据库服务器吗? dev.mysql.com/doc/refman/8.0/en/load-data.html 上显示的 LOAD-DATA-INFILE 语法对分隔符没有限制,因此 @%@ 无论如何都应该工作。我不会尝试使用 HeidiSQL 之类的工具从远程位置上传这么多数据
  • 如果我正确理解了这个问题,topicstarters CSV 包含两个分隔符。 @IvoP @%@ @^@ MySQL 的 LOAD DATA 子句不能同时处理两个..
  • 我对规范的解读:@%@field 分隔符,@^@line 分隔符。

标签: python mysql pandas csv heidisql


【解决方案1】:

MySQL LOAD DATA 语句将处理具有多个字符分隔符的 csv 文件

https://dev.mysql.com/doc/refman/5.7/en/load-data.html

我希望是这样的:

LOAD DATA LOCAL INFILE '/dir/my_wonky.csv' 
INTO TABLE my_table 
FIELDS TERMINATED BY '@%@'
LINES TERMINATED BY '@^@'
( col1 
, col2
, col3
)

我会使用 .csv 文件的一个非常小的子集并将其加载到测试表中,只是为了让它工作,进行必要的调整,验证结果。

我还希望将负载分解为更易于管理的块,并避免耗尽 ibdata1 文件中的回滚空间。我会使用pt-fifo-split(Percona 工具包的一部分)之类的东西将文件分解为一系列单独的加载,但不幸的是,pt-fifo-split 没有提供指定行分隔符的方法。为了利用它,我们必须对文件进行预处理,替换现有的换行符,并将行分隔符 @^@ 替换为换行符。

(如果我必须一次性加载整个文件,我会将其加载到 MyISAM 表中,而不是 InnoDB 表中,作为临时表。而且我会有一个单独的进程来复制行(以合理大小的块)从 MyISAM 暂存表到 InnoDB 表。)

【讨论】:

  • 用真正的新行替换 @^@ 可以用 sed 完成:`sed 's/|@^@|/\n/g' test.txt
  • @IvoP:在我们用换行符替换行分隔符之前,我们还想对文件中的任何真正的换行符进行编码。或者至少验证没有任何换行符。 (定界符不是换行符肯定是有原因的……最可能的解释是我们期望数据中有换行符。)