[Из песочницы] Плагин «Rainbow CSV» как альтернатива Excel

Привет, Хабр! Эта статья про плагин Rainbow CSV, который я написал для 5 текстовых редакторов:

VS Code, Vim, Sublime Text 3, Atom, Gedit

Думаю, что многие читатели этой статьи периодически сталкиваются с CSV (comma-separated), ТSV (tab-separated) и подобными файлами. Если попробовать открыть их в текстовом редакторе (а как иначе узнать что там внутри?), то откроется совершенно невзрачная картина как с левой стороны изображения. Глядя на это сложно сказать даже сколько колонок в таблице. С правой стороны картинки тот же файл с включенным RainbowCSV, читаемость значительно повысилась за счет синтаксической подсветки.

image

Синтаксис для такой подсветки, как ни странно, задается с помощью всего лишь одной (хоть и длинной) строчки-регулярного выражения:

((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?

Правило подсветки целиком можно найти, например, здесь (версия для VS Code), но, кроме самого регулярного выражения, там совершенно не на что смотреть.

Для сравнения, синтаксис файлы для языков общего назначения, таких как Python, JS, C++ и т.д. занимают обычно несколько сотен строчек весьма эзотерического кода.

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

Подсказка: Вот такое простое выражение ([^,]*,)?([^,]*,)? — подсветит CSV файл в 2 разных чередующихся цвета, но будет неправильно работать на запятых внутри полей, экранированных кавычками.

Кстати, здесь и далее описывается версия Rainbow CSV для Visual Studio Code, т.к. это вариант плагина в данный момент самый технически продвинутый и популярный (больше 500K загрузок).

Итак, помимо того, что Rainbow CSV подсвечивает столбцы, он также может:


  • Сказать на какую колонку в данный момент указывает курсор: номер колонки + название из первой строчки-заголовка. Если в начале файла строчки-заголовка нет (сразу идут данные), то пользователь может задать свой «Виртуальный» заголовок.
  • Автоматически проверить файл на предмет разного числа записей в строке или неправильного использования символов экранирования — «CSV Lint».
  • Выполнить SQL-like запрос с помощью встроенного в плагин интерпретатора RBQL, который позволяет применять очень широкий класс текстовых преобразований к входной таблице.
    RBQL поддерживает почти все операторы SQL (SELECT, UPDATE, WHERE, ORDER BY, TOP/LIMIT, JOIN, GROUP BY), а также все стандартные функции и операторы из JavaScript и Python.
    RBQL это отдельная технология, но она очень удачно вписывается в концепцию Rainbow CSV, и поэтому такая интеграция дает много преимуществ.

Одним из важнейших свойств Rainbow CSV плагинов является автоматическое обнаружение CSV файлов по их контенту. Эта функциональность крайне необходима, т.к. зачастую CSV (или TSV) файлы имеют файловое расширение отличное от .csv (.tsv). Также можно встретить файлы с расширением .csv в которых реально в качестве разделителя используется точка с запятой ;. Алгоритм определения табличного файла по контенту очень прост — достаточно проверить, что количество ячеек в каждой строчке при split’e по данному разделителю это постоянная > 1.


Сравнение Rainbow CSV с графическим выравниванием

Вообще, традиционный способ просмотра CSV данных это импорт их в какой-либо графический редактор, например Excel.
По сравнению с этим способом, у Rainbow CSV есть как преимущества, так и недостатки:


Преимущества:


  • What You See Is What You Get — можно быть уверенным в том, что то, что видно на экране — это реальное содержимое файла.
  • Знакомое окружение любимого текстового редактора
  • Zero-cost abstraction: Синтаксическая подсветка очень «дешева» с вычислительной точки зрения по сравнению с графическим выравниванием.
  • Более высокая плотность информации: На один экран влезает больше данных — графическое выравнивание «съедает» много места за счет выравнивающих пробелов.
  • Возможность визуально связать одну колонку (подсвеченную одним цветом) из разных окон


Недостатки:


  • В стандартной реализации используется 10 разных цветов, поэтому когда число колонок больше 10, цвета начинают повторяться и эффективность цветового кодирования колонок снижается.
  • Отсутствует поддержка переноса строк в ячейках, заэкранированных двойными кавычками. Здесь можно почитать подробности этой проблемы. Впрочем, я считаю, что CSV с переносом строки внутри ячеек это крайне непрактичный формат.


Сравнение с текстовым выравниванием

Еще один способ повысить читаемость CSV файлов, это выравнивание с помощью пробелов, но данный способ модифицирует содержимое файла, и поэтому его применимость весьма ограниченна.

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


Немного о проекте

Первая версия Rainbow CSV была написана 5 лет назад для Vim на основе плагина rainbow_parentheses Как можно заметить, от этого проекта я позаимствовал не только часть кода, но и половину названия =)
Версии для VSCode, Atom, и Sublime Text 3 появились год назад.

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


Сравнение процесса разработки плагина для разных редакторов

В заключение могу провести небольшое сравнение API популярных текстовых редакторов.
API для плагинов у VSCode, Atom и Sublime Text 3 довольно похожи между собой, основное различие в том, что расширения для VS Code и Atom пишутся на JavaScript, а для Sublime Text 3 на Python.

Все 3 редактора используют один и тот же движок регулярных выражений для синтаксической подсветки, поэтому перенос Rainbow CSV между этими редакторами потребовал лишь минимальной адаптации регулярок.

В целом могу сказать, что самый приятный и удобный процесс разработки плагинов предоставляет VS Code. С другой стороны именно в нем по каким-то причинам изначально отсутствовала некоторая функциональность, необходимая для полноценной работы Rainbow CSV, но команда VS Code с радостью приняла и улучшила мой PR, который добавлял необходимый мне метод.

Написание плагинов для Vim очень сильно отличается от этих 3 более новых редакторов. В Vim используется свой собственный язык VimScript, а также разнообразные команды для манипуляции содержимым открытых файлов. Синтаксическая модель, которую Vim использует для подсветки, также довольно сильно отличается от того, что предоставляют VSCode, Atom и Sublime.


Ссылки:


© Habrahabr.ru