Вопрос или проблема
Я помню из своих дней с MS Office функцию Слияние почты: у меня была таблица в Excel, шаблон в Word, и Слияние почты создавало документ Word из каждой строки в таблице Excel.
Теперь я полностью перешел на текстовые файлы: CSV для таблиц и Markdown для текста, и я хотел бы обработать CSV и шаблон в стек файлов Markdown (которые я затем конвертирую с помощью Pandoc в HTML/PDF).
A) Инструмент типа “Слияние почты”
Существует ли такой инструмент типа “Слияние почты” для этого рабочего процесса? Я предпочел бы инструмент командной строки, потому что все остальное в цепочке инструментов основано на CLI.
B) Инструмент для обоих направлений
Самая крутая функция была бы, если бы конвертация была возможна в обоих направлениях:
CSV+Markdown шаблон –> Группа документов Markdown
и наоборот
Группа документов Markdown –> CSV+Markdown шаблон
Я искал что-то подобное, и поскольку не смог найти это, я написал небольшой скрипт на Python, следуя принципам, изложенным rd_nielsen.
https://gist.github.com/frederik-elwert/5d0fee06aad946c75ef03084a2684233
Вы можете вызвать его так:
python3 pandoc-merge.py --csv addresses.csv -o merged_letter.pdf letter_template.md
В вашем шаблоне вы можете использовать {{ variable }}
и другие конструкции jinja2 для вставки содержимого из полей вашего CSV файла.
Если вы знакомы с R и современным R скриптингом:
Вы можете использовать пакет knitr
в R, написать небольшой файл .Rmd
и “связать” документ в markdown+html (+ опционально .docx и pdf) одним разом с помощью инструмента командной строки Rscript
.
knitr имеет опцию “keep_md” в YAML front matter.
Вместе с пакетом blogdown R и генератором статических сайтов Hugo, вы можете построить хорошее шаблонное решение. (Вам не нужно строить веб-сайт).
Упомянутый вами “обратный путь” (от страницы к шаблону+csv) вероятно, невозможен.
Рассмотрите возможность использования языков шаблонов, таких как Jinja (https://palletsprojects.com/p/jinja/) или Airspeed (https://github.com/purcell/airspeed) в качестве вашего Markdown шаблона. Тогда вам просто нужен небольшой код (оба указанных выше ссылки ведут на библиотеки Python, так что Python будет разумным языком для использования), чтобы прочитать CSV файл и пропустить его через шаблон для генерации окончательного Markdown.
Эти два шага можно выполнить с помощью команд метаимпорта и метаэкспорта execsql.py. Дисклеймер: я его написал. Он даже может создать базу данных SQLite на лету, чтобы импортировать данные. Это инструмент командной строки. Однако он не удовлетворит ваше желание обратить процесс слияния почты.
Конвертируйте файл *.csv в отдельные файлы *.txt для данных и используйте этот инструмент, файл *.pdf можно импортировать как фон вместе с 5 файлами *.txt для данных, которые будут “наложены / объединены” на pdf файл.
Ответ или решение
Mail Merge: CSV + Markdown — Подробный Обзор
Переход на использование CSV для таблиц и Markdown для текстов открывает новые горизонты в автоматизации документооборота. В этом ответе мы рассмотрим, как обеспечить процесс Mail Merge для вашего рабочего цикла и какое программное обеспечение поможет вам в этом.
A) Инструменты для Mail Merge
Для реализации функционала, аналогичного Mail Merge, в комбинации CSV и Markdown, существует несколько подходящих инструментов. Основное внимание уделим простым в использовании командным инструментам, так как вы предпочитаете CLI-решения.
-
Python Скрипты:
Как вы уже упомянули, можно использовать Python для реализации Mail Merge с помощью CSV и Markdown. Например, скрипт, который вы нашли на Gist, позволяет вам выполнить команду, похожую на:python3 pandoc-merge.py --csv addresses.csv -o merged_letter.pdf letter_template.md
Используя шаблон в формате Markdown, вы можете внедрять переменные из CSV-файла (например,
{{ variable }}
), что позволяет динамически формировать документы. -
Использование Jinja2:
Особо следует упомянуть библиотеку Jinja2, которая позволяет создавать шаблоны с мощными функциями обработки данных. Небольшой скрипт на Python, использующий Jinja2, сможет сделать то же самое, что и вышеописанный Gist, но с дополнительными возможностями настройки. -
Pandoc:
Pandoc, хотя и не является tool-ом непосредственно для Mail Merge, позволяет конвертировать Markdown в другие форматы, такие как HTML или PDF. Его можно легко интегрировать в ваш рабочий процесс.
B) Двусторонние инструменты
Когда речь заходит о двусторонней функциональности (CSV + Markdown → Документы Markdown и наоборот), это становится более сложным заданием.
-
Конвертация из Markdown в CSV:
В то время как создание документов из данных CSV вполне выполнимо, обратная задача — извлечение данных из готовых Markdown-документов для создания CSV — требует разработки. Существующих готовых решений для этого, к сожалению, нет. Однако можно написать пользовательский скрипт, который будет парсить Markdown и структурировать найденные данные в CSV формат. Это будет иметь определённые ограничения, учитывая стиль и форматирование Markdown. -
Использование R и knitr:
Если вас не пугает использование R, пакетknitr
позволяет создавать документацию в различных форматах и может быть использован как альтернатива для Markdown + CSV. Язык R также предоставляет мощные инструменты для анализа данных, что может быть полезно в вашем контексте.Rscript -e "knitr::knit('template.Rmd')"
Заключение
Таким образом, Mail Merge между CSV и Markdown в конечном итоге реализуем через комбинированные инструменты, такие как Python с Jinja2 и Pandoc, что позволяет автоматизировать создание документов. Однако двусторонняя функциональность останется ограниченной и потребует дополнительных усилий по разработке.
Резюмируя, вам предстоит выбрать подходящий инструмент, основываясь на своих предпочтениях в программировании и существующей инфраструктуре. HTML и PDF, созданные с использованием Pandoc, могут стать отличным финальным продуктом для ваших нужд.