Подтвердить что ты не робот

Инструмент Linux для анализа файлов CSV

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

4b9b3361

Ответ 1

Мой редактор потока FOSS CSV CSVfix делает именно то, что вы хотите. Существует двоичный установщик для Windows и компилируемая версия (через make файл) для UNIX/Linux.

Ответ 2

csvtool действительно хорош. Доступно в Debian/Ubuntu (apt-get install csvtool). csvtool является частью CSAM OCaml: https://github.com/Chris00/ocaml-csv

Ответ 3

Как было предложено @Jonathan в комментарии, есть модуль для python, который предоставляет инструмент командной строки csvfilter. Он работает как cut, но правильно обрабатывает столбец CSV:

csvfilter -f 1,3,5 in.csv > out.csv

Если у вас есть python (и вы должны), вы можете установить его просто так:

pip install csvfilter

Дополнительная информация на https://github.com/codeinthehole/csvfilter/

Ответ 4

Попробуйте crush-tools, они отлично справляются с данными с разделителями. Это похоже на то, что вы ищете.

Ответ 5

Я нашел csvkit, чтобы быть полезным, он основан на модуле python csv и имеет довольно много возможностей для синтаксического анализа сложных файлов csv.

Хотя это кажется немного медленным. Я получаю 4 МБ/с (со 100% процессором) при извлечении одного поля из 7 ГБ csv с 5 столбцами.

Чтобы извлечь четвертый столбец из file.csv

csvcut -c 4 file.csv

Ответ 6

Я тоже написал один из этих инструментов (только UNIX), называемый csvprintf. Он также может конвертировать в XML в онлайн-режиме.

Ответ 7

Моя реакция кишки заключалась бы в написании обертки script вокруг модуля csv Python (если этого еще не было).

Ответ 8

Для супермассивной оболочки вокруг модуля Python csv вы можете посмотреть pluckr.

Ответ 9

ffe - еще один отличный инструмент. Это требует создания файла конфигурации для большинства нетривиальных задач. Поверхность заключается в том, что она очень гибкая и может обрабатывать все виды структуры, логики и форматирования, которые не могут выполнять другие инструменты.

Мне нравится использовать csvtool для быстрых заданий и использовать ffe для сложных заданий или заданий, требующих частых повторений.

Ответ 10

Это звучит как работа для awk.

Вам, скорее всего, нужно будет написать свой собственный script для ваших конкретных потребностей, но этот сайт имеет некоторый диалог о том, как идти об этом.

Вы также можете использовать утилиту cut, чтобы вырезать поля.

Что-то вроде:

cut -f 2,5,6 -d , filename

где аргумент -f - это поле, которое вы хотите, и -d - необходимый делитель. Затем вы можете отсортировать эти результаты, найти уникальные или использовать любую другую утилиту bash. Существует прохладное видео здесь о работе с CSV файлами из командной строки. Лишь через минуту я посмотрю.

Однако, я думаю, вы могли бы объединить утилиту cut с awk и не захотеть ее использовать. Я действительно не знаю, что именно вы подразумеваете под командой bash, поэтому я все же предлагаю его.

Ответ 11

Быстрый google показывает awk script, который, похоже, обрабатывает файлы csv.

Ответ 12

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 (без кавычек).