инструменты для добавления столбцов в большой CSV-файл (объединение CSV-файлов по столбцам) - PullRequest
0 голосов
/ 25 июня 2019

Чтобы создать два 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 столбцов, поэтому мне нужен инструмент, который может выполнить задачу без одновременного хранения всех данных в оперативной памяти.

Можно ли использовать csvtool с экранированными кавычками или есть другой инструмент, который мог бы решить эту проблему?

Конечной целью для CSV-файла является база данных в mariadb, поэтому эффективнаяимпорт в mariadb с использованием t0.txt и t1.txt напрямую был бы еще лучше, но, насколько я знаю, LOAD DATA INFILE работает только с одним CSV-файлом.

Я определенно предпочитаю готовыйинструмента, но если его нет, то некоторые фрагменты C, Perl или Python также будут оценены.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вот быстрый 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
1 голос
/ 25 июня 2019

CSV-файлы обычно экранируют двойные кавычки при повторении ("", а не \"), поэтому ваши файлы могут считаться недействительными.

Вы можете использовать инструмент поиска и замены, например sedв Unix, чтобы исправить экранированные кавычки в этом более распространенном формате.

Если вам нужен какой-то другой инструмент командной строки для работы с CSV-файлами, я создал один, который доступен по адресу https://github.com/pjshumphreys/querycsv

...