OpenRefine text transform unique() игнорируя регистр

Есть ли способ сказать unique () игнорировать регистр?

У меня есть GREL, который работает как

forEach(value.split(","),v,v.trim()).uniques().join(",")

Это берет каждое значение в ячейке, разделенной запятыми, и затем выплевывает уникальное значение / я в этой ячейке. Прекрасно работает, однако, если у меня есть ячейка, которая содержит Пола, он вернет оба, а не просто "Пол".

Можно ли временно привести все значения в верхний регистр для сравнения, а затем вернуть первое написанное вами уникальное слово?

Или, может быть, я должен сделать это с Python/Jython?

2 ответа

Решение

Проверка, я понимаю проблему - например, если вы начинаете с:

Пол, Пол, Эдвард, Эдвард

Правильно ли я предполагаю, что вы хотите получить:

Пол, Эдвард

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

Итак, что-то вроде: Дублируйте данные в новый столбец под названием "ключи", используя "Редактировать столбец-> Добавить столбец на основе этого столбца" с преобразованием GREL:

forEach(value.split(","),v,v.trim().toLowercase()).uniques().join(",")

Теперь у вас есть:

| Col1                    | keys        |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | paul,edward |

Теперь вы можете перебирать значения в столбце ключей и находить первое значение в Col1, которое преобразуется в этот ключ с использованием того же преобразования: Для этого в столбце "ключ" вы можете использовать преобразование:

forEach(value.split(","),v,filter(cells["Col1"].value.split(","),w,w.trim().toLowercase()==v)[0]).join(",")

Это должно оставить вас с

| Col1                    | keys        |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | Paul,Edward |

Конечно, стоит отметить, что если ваши исходные данные находятся в другом порядке, вы получите другое конечное значение - например, "PAUL,Paul,Edward,edward" в итоге получит "PAUL,Edward". Можно проделать еще некоторую работу, чтобы улучшить это, но будут ограничения.

Вам также может потребоваться, в зависимости от ваших данных, перевернуть проблему, перейдя в режим "Записи" и выполнив "Разделение многозначных ячеек" вместо длинного выражения GREL join()... создавая тем самым дополнительные строки записи. каждое значение.

|Col1                       |Split      |
|Paul, PAUL, Edward, edward |Paul       |
|                           |PAUL       |
|                           |Edward     |
|                           |edward     |

Оттуда вы можете работать со столбцом Split или создать новый столбец, основанный на уникальных выражениях, других выражениях Grel и т. Д. Вы можете выполнить Fill Down на Col1, чтобы дальнейшие операции не потеряли ключевую запись "Пол, Пол, Эдвард". Эдвард.

Помните, что в OpenRefine есть отличные операции GREL, но большая часть мощности исходит от режима записи, операций Facets и Row... не только операций с колонками и ячейками. Так что не ограничивайте себя только длинным полным синтаксисом Grel. Попробуйте устранить проблемы, используя все операции и режимы OpenRefine.

Для получения дополнительной информации о "Разделении многозначных ячеек" и других операциях см. Наш вики-раздел: https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing

Другие вопросы по тегам