Как разобрать файл CSV в Bash? - PullRequest
88 голосов
/ 26 ноября 2010

Я работаю над длинным скриптом Bash.Я хочу читать ячейки из файла CSV в переменные Bash.Я могу разобрать строки и первый столбец, но не любой другой столбец.Вот мой код:


  cat myfile.csv|while read line
  do
    read -d, col1 col2 < <(echo $line)
    echo "I got:$col1|$col2"
  done

Это только печать первого столбца.В качестве дополнительного теста я попробовал следующее:

read -d, x y < <(echo a,b,)

И $ y пусто.Поэтому я попытался:

read x y < <(echo a b)

И $ y равен b.Почему?

Ответы [ 3 ]

172 голосов
/ 26 ноября 2010

Вам нужно использовать IFS вместо -d:

while IFS=, read -r col1 col2
do
    echo "I got:$col1|$col2"
done < myfile.csv

Обратите внимание, что для синтаксического анализа CSV общего назначения вы должны использовать специализированный инструмент, который может обрабатывать поля в кавычках с внутренними запятыми, среди других проблем, которые Bash не может решить сам. Примерами таких инструментов являются cvstool и csvkit.

8 голосов
/ 26 ноября 2010

Со страницы man:

-d delim Первый символ delim используется для завершения строки ввода, а не перевода строки.используя -d,, который завершит строку ввода через запятую.Это не будет читать остальную часть строки.Вот почему $ y пусто.

1 голос
/ 25 января 2019

Мы можем проанализировать CSV-файлы со строками в кавычках и разделенными с помощью say |с помощью следующего кода

while read -r line
do
    field1=$(echo $line | awk -F'|' '{printf "%s", $1}' | tr -d '"')
    field2=$(echo $line | awk -F'|' '{printf "%s", $2}' | tr -d '"')

    echo $field1 $field2
done < $csvFile

awk анализирует строковые поля в переменных и tr удаляет кавычку.

Немного медленнее, поскольку awk выполняется для каждого поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...