【问题标题】:tools for appending column(s) to large CSV-file (merging CSV-files by column(s))将列附加到大型 CSV 文件的工具(按列合并 CSV 文件)
【发布时间】: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


【解决方案1】:

这是一个快速的 perl 脚本,它可以一次性读取损坏的 CSV 文件、合并它们并输出正确转义的 CSV:

#!/usr/bin/env perl
use warnings;
use strict;
use autodie;
# Install through your OS package manager or CPAN client.
# libtext-csv-xs-perl on Debian/Ubuntu and family.
use Text::CSV_XS; 

open my $file0, "<", $ARGV[0];
open my $file1, "<", $ARGV[1];

my $csv = Text::CSV_XS->new({ binary => 1, escape_char => "\\",
                              auto_diag => 2, strict => 0});
my $out = Text::CSV_XS->new({ binary => 1 });

while ((my $row0 = $csv->getline($file0)) &&
       (my $row1 = $csv->getline($file1))) {
  push @$row0, @$row1;
  $out->say(\*STDOUT, $row0);
}

例子:

$ perl mergecsv.pl t0.txt t1.txt
123,foo,bar
456,"foo""bar""",baz

【讨论】:

    【解决方案2】:

    CSV 文件通常通过重复转义双引号("" 而不是\"),因此您的文件可能被视为无效。

    您可以使用查找和替换工具(例如 Unix 上的 sed)将转义的引号修复为这种更常见的格式。

    如果您正在寻找其他一些命令行工具来处理 CSV 文件,我已经编写了一个可以在 https://github.com/pjshumphreys/querycsv 获得的工具

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2014-05-13
      • 2013-11-25
      • 2016-04-08
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多