Ответ 1
Мой редактор потока FOSS CSV CSVfix делает именно то, что вы хотите. Существует двоичный установщик для Windows и компилируемая версия (через make файл) для UNIX/Linux.
Кто-нибудь знает о отдельной программе командной строки, которая может использоваться для разбора CSV файлов?
Чтобы сделать что-то вроде:
csvparse -c 2,5,6 имя_файла
извлекать поля из столбцов 2 5 и 6 из всех строк.
Он должен иметь возможность обрабатывать формат файла csv: http://tools.ietf.org/html/rfc4180, что означает поля цитирования и экранирование внутренних кавычек по мере необходимости, поэтому для строки примера с тремя полями:
field1, "field, number" "2" ", имеет внутренний цитаты и запятая", поле3
так что, если я запрашиваю поле 2 для строки выше, я получаю:
Полечисло "2", имеет внутренние кавычки и запятая
Я понимаю, что к этой проблеме есть множество решений perl, awk (и т.д.), но я бы хотел, чтобы собственный инструмент командной строки bash не требовал, чтобы я вызывал какую-то другую среду сценариев или писал любой дополнительный код (!).
Мой редактор потока FOSS CSV CSVfix делает именно то, что вы хотите. Существует двоичный установщик для Windows и компилируемая версия (через make файл) для UNIX/Linux.
csvtool действительно хорош. Доступно в Debian/Ubuntu (apt-get install csvtool). csvtool является частью CSAM OCaml: https://github.com/Chris00/ocaml-csv
Как было предложено @Jonathan в комментарии, есть модуль для python, который предоставляет инструмент командной строки csvfilter. Он работает как cut, но правильно обрабатывает столбец CSV:
csvfilter -f 1,3,5 in.csv > out.csv
Если у вас есть python (и вы должны), вы можете установить его просто так:
pip install csvfilter
Дополнительная информация на https://github.com/codeinthehole/csvfilter/
Попробуйте crush-tools, они отлично справляются с данными с разделителями. Это похоже на то, что вы ищете.
Я нашел csvkit, чтобы быть полезным, он основан на модуле python csv и имеет довольно много возможностей для синтаксического анализа сложных файлов csv.
Хотя это кажется немного медленным. Я получаю 4 МБ/с (со 100% процессором) при извлечении одного поля из 7 ГБ csv с 5 столбцами.
Чтобы извлечь четвертый столбец из file.csv
csvcut -c 4 file.csv
Я тоже написал один из этих инструментов (только UNIX), называемый csvprintf. Он также может конвертировать в XML в онлайн-режиме.
Моя реакция кишки заключалась бы в написании обертки script вокруг модуля csv Python (если этого еще не было).
Для супермассивной оболочки вокруг модуля Python csv
вы можете посмотреть pluckr.
ffe
- еще один отличный инструмент. Это требует создания файла конфигурации для большинства нетривиальных задач. Поверхность заключается в том, что она очень гибкая и может обрабатывать все виды структуры, логики и форматирования, которые не могут выполнять другие инструменты.
Мне нравится использовать csvtool
для быстрых заданий и использовать ffe
для сложных заданий или заданий, требующих частых повторений.
Это звучит как работа для awk.
Вам, скорее всего, нужно будет написать свой собственный script для ваших конкретных потребностей, но этот сайт имеет некоторый диалог о том, как идти об этом.
Вы также можете использовать утилиту cut, чтобы вырезать поля.
Что-то вроде:
cut -f 2,5,6 -d , filename
где аргумент -f - это поле, которое вы хотите, и -d - необходимый делитель. Затем вы можете отсортировать эти результаты, найти уникальные или использовать любую другую утилиту bash. Существует прохладное видео здесь о работе с CSV файлами из командной строки. Лишь через минуту я посмотрю.
Однако, я думаю, вы могли бы объединить утилиту cut с awk и не захотеть ее использовать. Я действительно не знаю, что именно вы подразумеваете под командой bash, поэтому я все же предлагаю его.
Быстрый google показывает awk script, который, похоже, обрабатывает файлы csv.
Perl script (требуется Text:: CSV_XS):
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my @opt_columns;
GetOptions("[email protected]" => \@opt_columns)
or die "Failed parsing options\n";
die "Must give at least one --column\n" if int(@opt_columns) == 0;
@opt_columns = map { $_-1 } @opt_columns; # convert 1-based to 0-based
use Text::CSV_XS;
my $csv = Text::CSV_XS->new ( { binary => 1 } );
open(my $stdin, "<-") or die "Couldn't open stdin\n";
open(my $stdout, ">-") or die "Couldn't open stdout\n";
while (my $row = $csv->getline($stdin)) {
my @nrow = @{$row}[@opt_columns];
$csv->print($stdout, \@nrow);
print "\n";
}
Поместите его в файл csvcut.pl
.
Пример использования только столбцов 3 и 4:
cat foo.csv | ./csvcut.pl --c 3 --c 4
Это будет указывать только столбцы, которые требуют кавычек, поэтому, если в столбце ввода есть "Bar" (с кавычками), он выйдет из Bar (без кавычек).