CSV в TSV без замены запятых в кавычках

Все учебники CSV to TSV предлагают простое:

tr ',' '\t'

, хотя некоторые CSV выглядят так:

1,310,"IntAct,PINA"

, и в этом случае я бы хотел сохранить "IntAct,PINA" :

1   310 "IntAct,PINA"

Как я могу параметризовать команду tr (или sed и т. Д.), Чтобы сделать это?

Я ценю любые предложения.

1
задан 2 July 2019 в 23:37

3 ответа

Используйте csvformat из csvkit :

csvformat -d, -D 

или короче:

csvformat -T file

-d входной разделитель (не требуется) здесь, поскольку , является входным разделителем по умолчанию)

-D выходной разделитель

-T устанавливает вкладки в качестве выходного разделителя

Он удалит цитаты, так как они не нужны для tsv.


Вы сможете установить csvkit через pip:

sudo apt install python-pip
pip install csvkit
\t' file

или короче:

csvformat -T file

-d входной разделитель (не требуется) здесь, поскольку , является входным разделителем по умолчанию)

-D выходной разделитель

-T устанавливает вкладки в качестве выходного разделителя

Он удалит цитаты, так как они не нужны для tsv.


Вы сможете установить csvkit через pip:

sudo apt install python-pip
pip install csvkit
2
ответ дан 2 July 2019 в 23:37

Использование CSV без заголовка

1,310,"IntAct,PINA"

и Миллер ( https://github.com/johnkerl/miller )

mlr --nidx --ifs "," --ofs "\t" cat input.csv

возвращают вас

1       310     "IntAct PINA"
0
ответ дан 2 July 2019 в 23:37

Если csvkit (который я рекомендую), не доступно, затем Вы могли использовать текст жемчуга:: модуль CSV:

perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new} print join "\t", $p->fields() if $p->parse($_)
' file

Если Вы настаиваете на том, чтобы сохранять заключение в кавычки (который является ненужным, начиная со встроенного , больше не разделитель), затем Вы могли сделать что-то как

print join "\t", map { $_ =~ s/.*,.*/"$&"/r } $p->fields() if $p->parse($_)
0
ответ дан 2 July 2019 в 23:37

Другие вопросы по тегам:

Похожие вопросы: