1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Всё о выводе результатов в CSV (табличное представление результатов)

Статья о выводе результатов в CSV формат и как корректно его открывать различными редакторами

  1. Support
    Табличное представление результатов - это очень популярный вид форматирования данных, собираемых А-Парсером. И чаще всего используется для этого используется именно формат CSV (Comma Separated Values), т.к. он по своей сути является текстовым файлом, который заполняется построчно. Это полностью соответствует стандартной логике вывода результатов в А-Парсере, и при этом вывод в CSV позволяет достаточно гибко настраивать разделители, ограничители ячеек и в целом общий вид результата. Для работы с такими файлами используются табличные редакторы, наверное наиболее известный из которых - Microsoft Excel. Его родной формат - xlsx, но сохранение данных в этом формате требует использования дополнительных модулей и соответственно написания JS парсера (пример такого сохранения рассмотрен в этой статье). Поэтому ниже разберем все варианты и нюансы работы с CSV в контексте A-Parser. Во всех примерах, где это не указано отдельно, будем использовать парсер SE::Google::Position SE::Google::Position. Также во всех примерах в Формате имени файла результата указываем расширение .csv
    [​IMG]


    Часть 1. Инструмент tools.CSVline()

    Встроенный инструмент tools.CSVline() является наиболее простым и рекомендуемым способом вывода в CSV для большинства задач. В качестве разделителя всегда используется запятая, а для ограничения ячеек - двойная кавычка. При этом двойные кавычки проставляются только там, где это необходимо, а внутри ячеек они экранируются. Возможности изменять разделители и ограничители нету.
    Рассмотрим несколько примеров использования.

    Вывод простых переменных
    Задача: получить позицию сайта по ключевому слову и сформировать таблицу результатов.
    Прописываем в Формате результата шаблон:
    Код:
    [% tools.CSVline(p1.key, p1.domain, p1.position) %]
    [​IMG]
    В результате получаем таблицу:
    [​IMG]

    Вывод массивов
    Задача: аналогична предыдущей, но требуется вывести все позиции искомого сайта вместе со ссылками из выдачи.
    Для этого уже нужно использовать цикл FOREACH и перебором вывести все элементы массива $positions:
    Код:
    [% FOREACH item IN p1.positions;
        tools.CSVline(p1.key, p1.domain, item.position, item.link);
    END %]
    [​IMG]
    Получаем такую таблицу:
    [​IMG]

    Теперь попробуем сделать итоговую таблицу более "красивой". Добавим заголовки, используя Начальный текст. И будем выводить ключ и домен только для первого совпадения, а для остальных оставим пустые ячейки. Таким образом у нас получится пример выборочного заполнения ячеек.
    Решается это добавлением в предыдущий шаблон условия IF...ELSE...END.
    Пропишем такой шаблон:
    Код:
    [% FOREACH item IN p1.positions;
        IF loop.index == 0;
            tools.CSVline(p1.key, p1.domain, item.position, item.link);
        ELSE;
            tools.CSVline('', '', item.position, item.link);
        END;
    END %]
    [​IMG]
    Получилась такая таблица:
    [​IMG]

    Для еще более наглядного изучения инструмента tools.CSVline() можно воспользоваться Тестированием шаблонов и поэкспериментировать с разными данными. На скриншоте ниже можно увидеть как выводятся данные, в каких случаях проставляются ограничители ячеек и как они экранируются.
    [​IMG]


    Часть 2. Использование шаблонизатора для форматирования CSV

    tools.CSVline() - это простой и рекомендованный для большинства задач способ табличного представления данных. Но бывают случаи, когда требуется поменять разделитель и/или ограничители, либо требуется использовать сложную логику заполнения ячеек. Для таких случаев форматирование CSV нужно полностью описать в шаблоне, включая экранирование ограничителей ячеек внутри самих ячеек.

    Вывод простых переменных и массивов в одну строку
    Задача: по ключевому слову получить позицию сайта в выдачи и вывести в одну строку все ссылки этого сайта, которые присутствуют в выдаче. Использовать в качестве разделителя символ вертикальной черты |.
    Использовать вышеописанный инструмент для этой задачи уже не получится, т.к. мы заранее не знаем сколько ссылок искомого сайта может быть в выдаче, а tools.CSVline() требует строго прописанного перечня переменных. Кроме этого нам также требуется изменить разделитель.
    Поэтому используем шаблонизатор и описываем нужный порядок вывода результата:
    Код:
    $p1.key|$p1.domain|$p1.position$p1.positions.format('|$link')\n
    [​IMG]
    Получаем таблицу в нужном виде:
    [​IMG]

    Вывод простых переменных и массивов в одну строку с экранированием
    Задача: используя SE::Google SE::Google по ключевому слову получить количество результатов в выдаче ($totalcount) и топ10 сниппетов. Вывести в одну строку (каждый сниппет в отдельной ячейке), используя в качестве разделителя табуляцию, а в качестве ограничителей ячеек - одинарную кавычку.
    В этом случае нам нужно позаботиться об экранировании одинарных кавычек там, где они могут присутствовать в получаемом результате. В данном случае это сниппеты, поэтому при их выводе предусмотрим замену. Пишем шаблон:
    Код:
    [% "'" _ query _ "'\t'" _ p1.totalcount _ "'";
    FOREACH item IN p1.serp;
        "\t'" _ item.snippet.replace("'", "''") _ "'";
    END;
    "\n" %]
    [​IMG]
    Получаем таблицу такого вида:
    [​IMG]


    Часть 3. Чем открывать CSV?

    Наиболее частый (и казалось бы наиболее простой) вопрос относительно вывода в CSV - это как и чем его правильно открывать. Рассмотрим несколько наиболее популярных вариантов.

    Microsoft Excel
    Эксель не всегда корректно распознает кодировку и/или формат данных, поэтому обычное открытие двойным кликом на файл лучше не использовать. Вместо этого нужно открыть пустую книгу в Excel и воспользоваться функцией импорта из CSV.
    [​IMG]
    При использовании такого импорта можно выбрать правильный разделитель и ограничитель ячеек, а также выбрать кодировку. A-Parser всегда сохраняет результаты в UTF-8. Также на этапе импорта Эксель предоставляет возможность преобразовать данные, поэтому вы сразу можете дополнительно их отформатировать.

    Google Таблицы
    Этот онлайн сервис также предоставляет возможность импортировать CSV файлы. Но при импорте он дает возможность выбрать только разделитель, а ограничитель ячеек нужно использовать стандартный (двойные кавычки), иначе он их не распознает. Инструмент tools.CSVline() рассчитан как раз на формат Google Таблиц и сохраняет данные в корректном виде для импорта в этот сервис.
    [​IMG]

    LibreOffice Calc
    LibreOffice - это open source офисный пакет, часто используемый в Linux системах. Calc - это его компонент, который позволяет работать с таблицами. По своей сути похож на Excel. И это единственный софт среди рассмотренных в этой статье, который корректно позволяет открывать CSV двойным кликом. При этом он сразу прелагает выбрать все необходимые параметры (разделитель, ограничитель, кодировка...) для корректного импорта.
    [​IMG]


    Заключение

    CSV - это удобный формат для вывода собранных данных, которые потом планируется дополнительно обрабатывать. Используя удобный табличный редактор данные можно сортировать, фильтровать и гибко анализировать. В этой статье мы рассмотрели варианты табличного представления данных и на реальных примерах показали как выводить результат из A-Parser в CSV формат.
    Евгений Кузьмин, b7186 и CNCNameless нравится это.