【发布时间】:2019-11-06 17:16:07
【问题描述】:
创建两个 csv 文件:
echo -e "123\n456" > t0.txt
echo -e '"foo","bar"\n"foo\"bar\"","baz"' > t1.txt
现在,我想将t1.txt 中的列追加到t0.txt,这样结果就变成了这样:
123,"foo","bar"
456,"foo\"bar\"","baz"
第一次尝试,使用csvtool
csvtool paste t0.txt t1.txt
Fatal error: exception Csv.Failure(2, 1, "Bad '"' in quoted field")
所以,csvtool 似乎无法处理 "foo\"bar\"" 中的转义引号。
我的实际用例有两个 CSV 文件,其中包含 +150.000.000 行和 11 列,因此我需要一个工具来完成任务,而无需同时将所有数据保存在 RAM 中。
csvtool 能否与转义引号一起使用,或者是否有其他工具可以解决这个问题?
CSV 文件的最终目标是mariadb 中的数据库,因此直接使用t0.txt 和t1.txt 有效导入t1.txt 会更好,但据我所知LOAD DATA INFILE仅适用于单个 CSV 文件。
我绝对更喜欢现成的工具,但如果没有,那么一些 C、Perl 或 Python sn-ps 也将不胜感激。
【问题讨论】:
-
在普通 csv 中,引号会通过加倍来转义...
"foo ""bar""" -
如果文件行数相同,
paste -d, t0.csv t1.csv?或者修复它们并使用您最初尝试的方法。 -
我的意思是paste,与csvtool不同,它不关心行的内容。
-
您的数据是否真的具有无效(或至少是非标准)CSV 格式,或者这只是您的示例的问题?您可以升级数据生成过程以生成有效的 CSV 数据吗?获得正确的输入数据将比修改它简单得多。在处理 CSV 数据时,您还需要知道 MariaDB 需要什么作为输入格式。它可能在 CSV 上使用非标准变体(“标准”是 Microsoft 在 Office(Excel 等)或 RFC 4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files 中使用的变体)。
-
这很好——似乎 MySQL 和 MariaDB 可以使用 CSV 格式的非标准变体。如果您的机器上安装了 Mercurial,则可以使用另一个工具 CSVfix。 OTOH,它最近的维护有点少——2014 年发布了 1.6 版,但不清楚从那以后发生了什么。它的职业生涯曲折——它曾经托管在 Google Code 上(之前的版本仍然可以通过 code.google.com/archive/p/csvfix 获得)。 “更新”中的 URL 错误。
标签: python c perl csv utilities