JQ для разбора CSV - Как пропустить заголовки - PullRequest
0 голосов
/ 24 сентября 2018

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

Содержимое CSV:

"1. ID","2. Height","3. Gender","4. Age"
"<1111111111>","5ft. 10.0in.","M"," 15.0"
"<2222222222>","6ft. 0in.","M"," 22.0"

Версия 1 команды CLI:

cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[1:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'

Выход версии 1: нет

Версия 2 команды CLI:

cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[0:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'

Выход версии 2:

{"phone_number":"1. ID","opt_in":"yes"}
{"phone_number":"1111111111","opt_in":"yes"}
{"phone_number":"2222222222","opt_in":"yes"}

Насколько я понимаю,. [1:] говорит JQ только анализировать строки (разделенные новой строкой) после строки № 1, однако строка № 1 будет диктовать ссылки (возможность ссылаться на номер_фона).

Так почему же версия 1 ничего не выводит?

1 Ответ

0 голосов
/ 24 сентября 2018

В версии 1 отсутствует параметр командной строки -s.

Другой способ пропустить строку заголовка - использовать inputs без параметра командной строки -n, как показано ниже.Использование inputs также намного эффективнее, чем использование параметра командной строки -s.

< source.csv sed 's/[\"<>]//g' |
jq -cR 'inputs 
      | split(",")
      | {"phone_number":.[0],"opt_in":"yes"}'

Надежность

Использование jq для анализа файла CSV сопряжено с потенциальными трудностями.В целом, было бы лучше использовать инструмент "csv2tsv" для преобразования CSV в TSV, с которым jq может легко справиться.

...