Использовать csvkit в bash-скрипте для конвертации CSV в нужный формат? - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно преобразовать большой CSV-файл в статический формат контента для Kirby CMS.

Скажем, у меня есть CSV-файл:

id,name,age,bio
0,bob,25,"Example bio, with a comma"
1,sam,37,"Hello World"
...

, который я хотел бы преобразовать в отдельныйпапки / файлы, например:

1_bob / person.txt

ID: 0
----
Name: bob
----
Age: 25
----
Bio: Example bio, with a comma

2_sam / person.txt

ID: 1
----
Name: sam
----
Age: 37
----
Bio: Hello World

и т. д.

Это, очевидно, гораздо более упрощенная версия моих данных, поэтому я подумал об использовании csvkit из-за его способности правильно анализировать запятые в полях в кавычках и т. Д.

Я нашел этот скрипт: https://forum.getkirby.com/t/import-from-csv/6038/15 который не удается в результате вышеуказанной проблемы (неспособность базового IFS bash читать более сложные данные CSV)

#!/bin/bash
OLDIFS=$IFS
IFS=";"
while read number year title website slug
do
  if [ ! -d "$number-$slug" ]; then
    mkdir ./$number-$slug
  fi
  echo -e "Year: $year\n----\nTitle: $title\n----\nWebsite: $website" > $number-$slug/project.txt
done < projects.csv
IFS=$OLDIFS

Я знаю, что мог бы написать скрипт на python, чтобы сделать это легко, но мне было интересно,действительно есть способ объединить любой инструмент csvkit, чтобы сделать это в скрипте bash. Я предполагал использовать csvcut для извлечения строк данных из CSV, но, конечно, я все еще в том же блоке, как анализировать эти данные и выводить их в желаемый формат.

1 Ответ

0 голосов
/ 30 октября 2019

Обычно гораздо проще обрабатывать файлы TSV по сравнению с файлами CSV - с помощью bash, awk и многих утилит. Это позволяет избежать необходимости цитирования. csvformat будет обрабатывать запрос:

Используя ваш текущий скрипт:

csvformat -T projects.csv | while IFS=$'\t' read number year title website slug
do
  if [ ! -d "$number-$slug" ]; then
    mkdir ./$number-$slug
  fi
  echo -e "Year: $year\n----\nTitle: $title\n----\nWebsite: $website" > $number-$slug/project.txt
done

Код ожидает столбец 'slug' для каждой записи, которой нет в вводе сэмпла. Я предполагаю, что фактический вход будет иметь это в 5-м столбце

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