Извлечь данные из файла CSV, где в некоторых полях есть запятая в значении поля

Чтение и запись в файловую систему может включают большое количество схем буферизации, обслуживание ОС, низкоуровневое управление дисками и множество других возможных действий. Таким образом, действия open () и close () служат в качестве настройки для этих типов скрытых действий. Различные реализации файловой системы могут быть настроены по мере необходимости и при этом оставаться прозрачными для вызывающей программы.

Если ОС не открывала / закрывала, то с помощью чтения или записи эти действия с файлом все равно должны были бы выполнять любые инициализации, очистку / управление буфером и т. Д. каждый раз. Это накладные расходы на повторяющиеся операции чтения и записи.

-1
19.02.2019, 20:43
2 ответа

Использование cvscutиз набора инструментовcsvkit:

$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr

-q "'"необходимо, чтобы сообщить csvcut, что в данных используется нестандартный -символ кавычек (одинарная кавычка ). -c 5,6извлекает столбцы пять и шесть. На выходе будет правильно отформатированный CSV-документ.

Чтобы получить только пятый столбец без добавления кавычек:

$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr

Это передает вывод с csvcutпо csvformatи запрашивает использование табуляции для разделителя вывода вместо запятых. Поскольку в данных нет вкладок, данные больше не нужно заключать в кавычки.

Это также, очевидно, работает для получения нескольких столбцов в формате табуляции -с разделителями:

$ csvcut -q "'" -c 5,6 file.csv | csvformat -T
,       jkk
,       rgr
rgr     rgr

Он также работает для преобразования всех данных, разделенных запятыми -, в данные, разделенные табуляцией -:

.
$ csvformat -q "'" -T file.csv
abv     sfs             hju    ,       jkk
wff     fst             rgr    ,       rgr
ere     edf     erg    ,       rgr     rgr

Разделение данных на вкладке -упрощает работу с ними с помощью стандартных инструментов Unix:

$ csvformat -q "'" -T file.csv | cut -f 5,6
,        jkk
,       rgr
rgr     rgr

Следующее воспроизводит ожидаемый результат:

$ csvformat -q "'" -T file.csv | awk -F '\t' '{ print $5; print $6 }'
,
jkk
,
rgr
rgr
rgr

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


Для более сложного синтаксического анализа рассмотрите другой язык сценариев, например Python или Perl.

Модуль Text::CVSв Perl обеспечивает легкий доступ к данным CSV. Нижеследующее просто показывает, что довольно легко прочитать полный файл в массив массивов в Perl:

$ perl -MData::Dumper -MText::CSV=csv -e '$c = csv(in=>"file.csv",quote_char=>"\x27");print Dumper($c)'
$VAR1 = [
          [
            'abv',
            'sfs',
            '',
            'hju',
            ',',
            'jkk'
          ],
          [
            'wff',
            'fst',
            '',
            'rgr',
            ',',
            'rgr'
          ],
          [
            'ere',
            'edf',
            'erg',
            ',',
            'rgr',
            'rgr'
          ]
        ];
4
28.01.2020, 05:07

С фрезой

<input sed "s/'/\"/g"  | mlr --c2x --implicit-csv-header cut -f 5,6 | \
grep -v "^$" | cut  -d " " -f 2

дает вам

,
jkk
,
rgr
rgr
rgr

Это не awk, это Miller — отличный инструмент для структурированного текста(http://johnkerl.org/miller/doc/).

1
28.01.2020, 05:07

Теги

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