GREL: различия между версиями

Материал из Поле цифровой дидактики
Новая страница: «{{Карточка языка программирования |Description=GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel и...»
 
Нет описания правки
 
Строка 24: Строка 24:




Таблица подсказок по GREL в OpenRefine
== Таблица подсказок по GREL в OpenRefine ==
 
{{Шаблон:GREL clue}}
{| class="wikitable"
! Контекст: что хотим сделать
! Где и в каком режиме
! Пример Expression (GREL)
|-
| Преобразовать текстовую дату в тип Date (для временных рядов)
| Меню столбца с датой → '''Edit cells → Common transforms → To date''' (выбор GREL не нужен, но важно понимать, что OpenRefine внутри применяет преобразование типа)  [datacarpentry.github](https://datacarpentry.github.io/openrefine-socialsci/02-working-with-openrefine.html)
| (автоматическое преобразование ISO‑строки, например `"2022-07-06T06:37:06Z"`)
 
— отдельное выражение не вводим
|-
| Вытащить год из даты в новый столбец (переменная времени \(t\))
| Меню столбца с датой → '''Edit column → Add column based on this column…''' → язык: GREL  [libjohn.github](https://libjohn.github.io/openrefine/grel.html)
| <syntaxhighlight lang="javascript">
value.toDate().toString("yyyy")
</syntaxhighlight>
Создаёт столбец `year` с годом, используемым как временной индекс
|-
| Построить строковое представление «год‑месяц» (для месячных рядов)
| Меню столбца с датой → '''Add column based on this column…'''
| <syntaxhighlight lang="javascript">
value.toDate().toString("yyyy-MM")
</syntaxhighlight>
Например, "2024-03"
|-
| Очистить пробелы в начале/конце и узнать длину строки
| Меню столбца с текстом → '''Edit cells → Transform…'''
| <syntaxhighlight lang="javascript">
value.trim().length()
</syntaxhighlight>
Полезно для диагностики «грязных» строк, где есть лишние пробелы [guides.library.illinois](https://guides.library.illinois.edu/openrefine/grel)
|-
| Заменить подстроку (очистка категорий)
| Меню столбца → '''Edit cells → Transform…'''
| <syntaxhighlight lang="javascript">
value.replace("old","new")
</syntaxhighlight>
Например, объединить разные варианты написания категорий [library.vassar](https://library.vassar.edu/openrefine/common_transformations)
|-
| Объединить значения двух столбцов (конструирование идентификатора панели)
| Меню любого из столбцов → '''Edit column → Add column based on this column…'''
| <syntaxhighlight lang="javascript">
cells["user"].value + "_" + cells["board_id"].value
</syntaxhighlight>
Создаёт composite key вида "user_board", удобный для группировок
|-
| Превратить JSON‑массив в строку с разделителем (подготовка к Split multi-valued cells)
| Меню столбца с массивом (например, idBoards) → '''Edit cells → Transform…'''  [programminghistorian](https://programminghistorian.org/en/lessons/fetch-and-parse-data-with-openrefine)
| <syntaxhighlight lang="javascript">
value.join("|")
</syntaxhighlight>
После этого используем '''Edit cells → Split multi-valued cells…''' с разделителем <code>|</code>
|-
| Посчитать количество строк с той же парой user–board (агрегация по ключу)
| В режиме Rows, любой столбец → '''Edit column → Add column based on this column…'''  [openup.org](https://openup.org.za/blog/openrefine-aggerate-tutorial)
| <syntaxhighlight lang="javascript">
length(
  filter(
    rows,
    r,
    r.cells["user"].value == cells["user"].value &&
    r.cells["board_id"].value == cells["board_id"].value
  )
)
</syntaxhighlight>
Даёт частоту пары (аналог COUNT(*) GROUP BY user, board_id)
|-
| Посчитать сумму числового показателя по user–board (например, events)
| Аналогично: '''Add column based on this column…''', предварительно столбец events → To number  [openup.org](https://openup.org.za/blog/openrefine-aggerate-tutorial)
| <syntaxhighlight lang="javascript">
sum(
  forEach(
    filter(
      rows,
      r,
      r.cells["user"].value == cells["user"].value &&
      r.cells["board_id"].value == cells["board_id"].value
    ),
    r, r.cells["events"].value
  )
)
</syntaxhighlight>
Аналог SUM(events) GROUP BY user, board_id
|-
| Фильтровать строки, где значение содержит подстроку (кастомный facet)
| Меню столбца → '''Facet → Custom text facet…'''
| <syntaxhighlight lang="javascript">
value.contains("wiki_edit")
</syntaxhighlight>
Возвращает true/false для фасета, удобно для выделения определённых типов событий [guides.lib.lsu](https://guides.lib.lsu.edu/c.php?g=1469606&p=10994060)
|}

Текущая версия от 19:54, 16 апреля 2026


Краткое описание языка GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню.
Компетенции в каких сферах формирует
Парадигмы программирования
Возрастная категория
Назначение языка (Общее / Учебное)
Visual_Text_Blocks
Измерение (2D/3D/Tangible)
Область знаний
Открытость продукта Открытый
Address
Предки (Ancestors) JavaScript
Потомки (Descendants)
Активность в данный момент Project is active
Доступны ремиксы? Нет
Год создания
Создатели
Поясняющее видео
Используется для создания мобильных приложений? Нет


GREL упоминается в свойствах следующих страниц


GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню.

GREL по синтаксису близок к JavaScript и работает с теми же типами данных, что и таблица OpenRefine: строки, числа, даты, массивы, [[JSON[[‑объекты. Основная переменная — `value` (значение текущей ячейки), но в выражениях можно обращаться и к другим столбцам через `cells["ColumnName"].value`.

В OpenRefine GREL можно использовать в четырёх основных контекстах:

  • создание Custom text / numeric facet (собственные фасеты на основе выражения);
  • Transform → Edit cells → Transform… (преобразование значений в столбце);
  • Edit column → Add column based on this column… (создание нового столбца на основе выражения);
  • некоторые расширенные операции (например, при Fetch URL) также используют GREL как язык выражений.
GREL полезен для
  • подготовки временных рядов (извлечение года/месяца из даты, агрегация по дате);
  • конструирования панели `объект × время` (например, `user, board_id, year`);
  • очистки текстовых категорий, работы с JSON‑массивами и вложенными объектами;
  • вычисления агрегатов (сумма, количество) по группе строк.


Таблица подсказок по GREL в OpenRefine

Контекст: что хотим сделать Где и в каком режиме Пример Expression (GREL)
Преобразовать текстовую дату в тип Date (для временных рядов) Меню столбца с датой → Edit cells → Common transforms → To date (выбор GREL не нужен, но важно понимать, что OpenRefine внутри применяет преобразование типа) (автоматическое преобразование ISO‑строки, например `"2022-07-06T06:37:06Z"`)

— отдельное выражение не вводим

Вытащить год из даты в новый столбец (переменная времени \(t\)) Меню столбца с датой → Edit column → Add column based on this column… → язык: GREL
value.toDate().toString("yyyy")

Создаёт столбец `year` с годом, используемым как временной индекс

Построить строковое представление «год‑месяц» (для месячных рядов) Меню столбца с датой → Add column based on this column…
value.toDate().toString("yyyy-MM")

Например, "2024-03"

Очистить пробелы в начале/конце и узнать длину строки Меню столбца с текстом → Edit cells → Transform…
value.trim().length()

Полезно для диагностики «грязных» строк, где есть лишние пробелы

Заменить подстроку (очистка категорий) Меню столбца → Edit cells → Transform…
value.replace("old","new")

Например, объединить разные варианты написания категорий

Объединить значения двух столбцов (конструирование идентификатора панели) Меню любого из столбцов → Edit column → Add column based on this column…
cells["user"].value + "_" + cells["board_id"].value

Создаёт composite key вида "user_board", удобный для группировок

Превратить JSON‑массив в строку с разделителем (подготовка к Split multi-valued cells) Меню столбца с массивом (например, idBoards) → Edit cells → Transform…
value.join("|")

После этого используем Edit cells → Split multi-valued cells… с разделителем |

Посчитать количество строк с той же парой user–board (агрегация по ключу) В режиме Rows, любой столбец → Edit column → Add column based on this column…
length(
  filter(
    rows,
    r,
    r.cells["user"].value == cells["user"].value &&
    r.cells["board_id"].value == cells["board_id"].value
  )
)

Даёт частоту пары (аналог COUNT(*) GROUP BY user, board_id)

Посчитать сумму числового показателя по user–board (например, events) Аналогично: Add column based on this column…, предварительно столбец events → To number
sum(
  forEach(
    filter(
      rows,
      r,
      r.cells["user"].value == cells["user"].value &&
      r.cells["board_id"].value == cells["board_id"].value
    ),
    r, r.cells["events"].value
  )
)

Аналог SUM(events) GROUP BY user, board_id

Фильтровать строки, где значение содержит подстроку (кастомный facet) Меню столбца → Facet → Custom text facet…
value.contains("wiki_edit")

Возвращает true/false для фасета, удобно для выделения определённых типов событий