Как извлечь столбец из CSV с кавычками, используя оболочку? - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть файл CSV, но в отличие от связанных вопросов, в нем есть несколько столбцов, содержащих строки в двойных кавычках с запятыми, например

foo,bar,baz,quux
11,"first line, second column",13.0,6
210,"second column of second line",23.1,5

(конечно, он длиннее ичисло запятых в кавычках не обязательно равно единице или 0, и текст не является предсказуемым.) Текст также может иметь (экранированные) двойные кавычки в двойных кавычках или не иметь двойных кавычек вообще для поля, обычно цитируемого в кавычках.Единственное допущение, которое мы можем сделать, это то, что нет заключенных в кавычки новых строк, поэтому мы можем разделить строки тривиально, используя \n.

Теперь я хотел бы извлечь конкретный столбец (скажем, третий) -скажем, для печати на стандартном выводе, одно значение в строке.Я не могу просто использовать запятые в качестве разделителей полей (и, например, использовать cut);скорее, мне нужно что-то более изощренное.Что бы это могло быть?

Примечание: я использую bash в системе Linux.

1 Ответ

0 голосов
/ 07 января 2019

Вот быстрый и грязный Питон csvcut.Библиотека Python csv уже знает все о различных диалектах CSV и т. Д., Поэтому вам просто нужна тонкая оболочка.

Первый аргумент должен выражать индекс поля, которое вы хотите извлечь, например,

csvcut 3 sample.csv

для извлечения третьего столбца из CSV-файла (возможно, цитируемого и т. Д.) sample.csv.

#!/usr/bin/env python3

import csv
import sys

writer=csv.writer(sys.stdout)
# Python indexing is zero-based
col = 1+int(sys.argv[1])
for input in sys.argv[2:]:
    with open(input) as handle:
        for row in csv.reader(handle): 
            writer.writerow(row[col])

Для этого: обработка ошибок, извлечение нескольких столбцов.(Само по себе не сложно; используйте row[2:5] для извлечения столбцов 3, 4 и 5; но мне лень писать правильный анализатор аргументов командной строки.)

...