Плагин «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.


Ссылки:


Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 50

    0
    С разделением столбцов табуляцией было бы удобнее, на мой взгляд. Файл физически можно не менять.
      +2
      Тут каждому свое. При наличии табуляций повышается наглядность, но теряется достоинство «Более высокая плотность информации».

      А в авторском варианте наглядность обеспечивается раскраской столбцов. Мне понравилось.
        +1

        Мне тоже удобнее работать с файлами, разделенными табуляцией (и Rainbow CSV их также поддерживает), но если у вас уже есть готовый файл, разделенный запятой, то с ним тоже как-то надо работать. Тем более табуляция реально выравняет столбцы только при очень специфическом наборе условий, чтобы реально выравнять столбцы табуляцией, можно, наверно, использовать технологию elastic tabs, которая на сколько я понимаю из коробки нигде не работает.

          0
          По-моему, эта идея с цветовой дифференциацией штанов столбцов может оказаться удобнее в случае, когда все элементы в столбце плюс-минус одинаковой длины, но изредка встречаются гораздо длиннее: при выравнивании табуляцией у нас возникнет уйма пустого места из-за одного длинного названия.
            0
            Как вариант, интеллектуально скрывать слишком длинные строки. При длинных строках заглавия столбцов тоже уплывают. В таком случае, может оказаться не понятно к чему относится поле, даже если оно цветом подсвечено.
          0
          Круто! Но у меня в VS Code такой файл не подсвечивается
          A;B;C
          1;2;3
            0
            Это уже DSV, а не CSV.
              0
              Надо запятые заменить на точку с запятой. Для Excel нужно в первой строке прописать sep=;
              На всеми любимом regex101.com не группирует по строкам
                0

                В вашем случае автодетекция не сработала, т.к. файл очень маленький. Нужно вручную переключить язык на "CSV (semicolon)" в правом нижнем углу

                +1

                В PyCharm есть удобная опция "View as table" (возможно, надо для этого установить плагин CSV). Мне кажется, это даже удобнее — можно сортировать по столбцам, например.

                  0
                  тссс)
                    0
                    А мультикаретка в этой таблице работает?
                      +1

                      К своему стыду, я еще не освоил мультикаретку в Idea.

                        0

                        Мультикаретка не работает.
                        Эта таблица больше Excel, чем текстовый редактор. Например, можно сортировать строки по какой-либо колонке.


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


                        скриншот

                        скриншот

                      +5
                      Принимаются предложения/просьбы насчёт реализации поддержки других редакторов?

                      Например, Notepad++
                        +5
                        Действитиельно, Notepad++ в списке не хватает
                          0

                          Подсветка или SQL?
                          SQL вроде есть: http://www.scout-soft.com/sql/
                          А если не нравится такой, можно сделать и другой.

                          +1
                          Я думал на счет Notepad++, но там, кажется, была проблема в том, что сторонние расширения не могут задавать сколько-нибудь сложные регулярки, т.е. надо коммитить в core.
                            0
                            Очень нужен Notepad++!
                              0
                              Far Manager?
                                0

                                Помню, что Colorer очень крутой и точно поддерживал regexp-ы, вполне возможно, что re из статьи даже править не придётся ;)

                            0
                            Было бы удобнее разделители (запятые) выделять одним и тем же цветом.
                              0
                              Спасибо, уже ближе к тому что нужно, обязательно попробую.

                              А пока уточню:
                              1. Нормально ли работает с переносом строк внутри «ячеек»? (Test case: В Excel есть таблица с ячейками с переносом строк; экспортировать ее в CSV)
                              2. Еще одна боль — очень длинные строки, например, 500 символов. Есть какие-то методы, как удобно отображать CSV, когда в некоторых «ячейках» присутствуют очень длинные значения?
                                0

                                Нет, к сожалению с переносом строк внутри ячеек работать не будет, я упомянул об этом в статье.
                                У меня есть версия для Vim, которая поддерживает перенос строк, но она пока не опубликована.
                                Вообще проблема CSV файлов с переносом строк в ячейках в том, что если в нем есть хоть один несбалансированный символ кавычек, то весь файл будет испорчен, т.к. автоматически невозможно угадать какая кавычка лишняя. Так же с такими файлами не будет работать random sampling и стандартные линуксовые тулзы такие как grep, wc. Многие алгоритмы на таком файле будут выполняться за O(N) вместо O(1).

                                +1
                                За RBQL отдельное спасибо!
                                  0
                                  Ага! Я может потом отдельную статью про RBQL напишу, но пока он еще немного сыроват
                                  0
                                  del
                                  • UFO just landed and posted this here
                                      0
                                      Идея скрывать колонки звучит круто и чем-то похожа на code folding только не по горизонтали, а по вертикали! Разумеется на данный момент ни один из редакторов ничего такого не поддерживает на сколько мне известно. Может быть только Atom с помощью каких-нибудь совершенно адских хаков. Задать цвет в VS Code, в принципе реально, но не с помощью синтаксической подсветки, а используя специальный пост-синтаксис цветовой декоратор. Историю для RBQL я давно планирую добавить, это довольно легко сделать.
                                      • UFO just landed and posted this here
                                          0
                                          В webview сразу теряется возможность редактирования текста стандартными инструментами редактора, единственным преимуществом перед column-alignment останется только компактность. Проще в том же webview сделать стандартную графическую решетку тогда. Расширение для браузера можно сделать, да. Но не факт что этим будет кто-то пользоваться, плюс поддерживать еще такую штуку у меня точно времени не хватит. Кстати, Electron — based Atom и VS Code уже в каком-то смысле можно считать браузерными расширениями. В Atom'е так вообще все подсвеченные токены — это просто набор span'ов, которыми можно манипулировать с помощью DOM.
                                          • UFO just landed and posted this here
                                      +1
                                      Вот так пользуешь и не знаешь, что автор на Хабре. Спасибо!
                                        0
                                        Раньше я был в режиме читателя =)
                                        –3

                                        Статья ни о чем. Нет ни слова о новой тесле и айфоне. Автор занимается ерундой.

                                          +2
                                          Может кому пригодится, для Атома есть вот такая крутая штука для работы с CSV: Tablr
                                          Гифка с принципом работы
                                          image
                                            0
                                            Ещё было бы удобно чётные/нечётные строки как-нибудь разделять, к примеру, тем же оттенком/насыщенностью, но чуть более тёмным цветом (когда утомлён, иногда начинаю испытывать проблемы с позиционированием взгляда и промахиваюсь на строчку выше/ниже)
                                              0
                                              Отличная идея, спасибо! Может быть попробую ее реализовать, как опцию, правда для каждого редактора это придется делать по отдельности. Кстати, в Vim, например, есть опция cursorline, которая включает подсветку текущей линии. Не совсем то что вы предлагаете, но может быть подойдет как workaround. Что-то подобное есть и в VSCode (editor.renderLineHighlight), но там это глобальная настройка и ее, видимо, не так просто включить для каких-то конкретных файлов.
                                            0
                                            Полезный плагин, но в свой работе мы используем разделители из нескольких символов. Насколько я понимаю, плагин такое не поддерживает.
                                              0
                                              Нет, не поддерживает. А как выглядит многосимвольный разделитель, если не секрет?
                                                +1
                                                По сути он может выглядеть хоть как. Мы договорились об использовании ~#~. Позволяет избежать неприятных ситуаций, когда точка с запятой или запятая или табуляция etc, имеются в самих столбцах
                                              0
                                              А есть ведь текстовые редакторы (помимо Excel :) ), которые позволяют csv сразу открывать и редактировать в табличном режиме?
                                                0
                                                Если пользуетесь python/pandas, есть pandastable. Не помню правда как там с редактированием, увы.
                                              +1
                                              Круто! В своё время очень не хватало такой штуки.
                                              А для Emacs будет? (для Vim же есть :))

                                              Оставлю тут ссылку на Miller, может кому-то пригодится. Позволяет манипулировать данными в форматах CSV, TSV, DKVP, JSON и не только. Unix-way утилита для командной строки, написано на С, без рантайм-зависимостей.
                                                0
                                                Только нашел и установил этот плагин, через пару дней статья ))

                                                Спасибо, очень удобная штука. По крайней мере для того, чтобы быстро посмотреть оригинал файла. Запросы я не пробовал: необходимости нет.
                                                  +1
                                                  Проникся идеей, и адаптировал её для старичка NEdit (только подсветку синтаксиса). Если кому-то нужно, то вот:
                                                  RainbowCSV.pats

                                                  Для использования: запустить
                                                  nedit -import path/to/RainbowCSV.pats
                                                  , потом Preferences → Save Defaults.

                                                  Несколько изменил регулярное выражение: с исходным NEdit выдавал ошибку «? operand could be empty», так что пришлось гарантировать, что подвыражения, к которым применяется квантификатор «?», не могут соответствовать (to match, как это правильно по-русски?..) пустой строке.
                                                    0
                                                    Круто! А вы не могли бы этот файл с README инструкцией выложить на github?

                                                Only users with full accounts can post comments. Log in, please.