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

246
36

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

спросил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
1
Решение
203

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
181

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
117

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


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

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


pip install csvfilter

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
108

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


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


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


csvcut -c 4 file.csv

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
109

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
89

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
77

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
77

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
63

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


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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
45

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


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


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


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


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

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


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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
45

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

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
45

Perl script (требуется Text:: CSV_XS):


#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;
my @opt_columns;
GetOptions("column=i@" => \@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 (без кавычек).

ответил(а) 2021-01-25T20:52:49+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема