Страницы: 1
RSS
Power Query транслитерация слов
 
Подскажите, пожалуйста, какой функцией Power Query можно сделать транслитерацию слов? Я так понимаю необходима таблица замен для каждой буквы и потом частичное совпадение в словах этих букв. Спасибо
 
Как вариант - самописная функия или же легкий способ, через справочник
 
еще вариант: доп.таблица из двух столбцов (напр, рус+англ), делаем на нужной строке Text.ToList, потом список в таблицу, к нему джойним нашу таблицу соответствий, и Text.Combine нужный столбец.
F1 творит чудеса
 
Ну, с русского на английский это сработает, а вот с транслита как на русский перевести?
Вот горшок пустой, он предмет простой...
 
Цитата
Максим Зеленский написал: делаем на нужной строке Text.ToList, потом список в таблицу, к нему джойним нашу таблицу соответствий...
Таблица есть (рус+англ)
Можно попросить на примере сделать эту функцию?
 
Цитата
dmriabkov написал: Можно попросить
OFF Надежнее - заказать, тогда и довороты, и качества можно требовать... ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Давайте закажу. Кто готов взяться?
Изменено: dmriabkov - 15.12.2017 18:45:58
 
Цитата
dmriabkov написал: Мне бы некачественный набросок, так сказать заготовку, я дальше разберусь.
Их есть у нас - http://www.planetaexcel.ru/search/?q=%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D1%­80%D0...= ... ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Я видел много решений через макрос. Желательно через Power Query конструктор на лету обновлять строки в транслит. Такого решения не нашел.
 
Вот мышкой наклацал то что имел ввиду Максим, но тут только для футболки реализовано
 
Примерно так.

Два варианта, с джойном и без. Второй мне даже больше нравится эстетически, но проверять надо на больших объемах, кто быстрее:

TranslitTable - это таблица транслитерации
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец для транслитерации", type text}}),
    #"Added Custom" = Table.AddColumn(  
        #"Changed Type", 
        "Translit", 
        each Text.Combine(
            List.ReplaceMatchingItems(
                Text.ToList([Столбец для транслитерации]), 
                List.Zip(Table.ToColumns(TranslitTable))
            )
        ), 
        type text)
in
    #"Added Custom"
F1 творит чудеса
 
Добрый день,
Максим Зеленский,  Спасибо! подскажите такой момент, правильно ли я понял работу List.ReplaceMatchingItems это что-то наподобие Switch? Точнее даже ВПР
Изменено: Илья Демид - 18.12.2017 18:08:46
 
Илья Демид, хм, я в таком аспекте даже не думал об этой функции. В EXCEL аналогов прямых нет. При работе с текстом можно представить что-то вроде функции ПОДСТАВИТЬ, у которой второй и третий аргумент - не одно значение, а список значений, которые заменяются попарно.

Там в описании самой функции в принципе достаточно прозрачно, два основных аргумента:
1) список значений (в моем примере это Text.ToList([Столбец для транслитерации]) )
2) список списков подстановки. То есть список из пар, каждая из которых записана в виде списка {что меняем, на что меняем}.

То есть, заменяет значения в списке в соответствии со схемой подстановки.

Код
List.Zip(Table.ToColumns(TranslitTable))
- вот в этом месте из таблицы из двух столбцов я создаю списки для подстановки.
Например, если в первом столбце русские, во втором английские буквы, то в результате Table.ToColumns(TranslitTable) получим что-то такое
Код
{
    {"а","б","в","г","д"},
    {"a","b","v","g","d"}
}

List.Zip его как бы транспонирует, преобразует его в нужный вид списков пар:
Код
{
    {"а","a"},
    {"б","b"},
    {"в","v"},
    {"г","g"},
    {"д","d"}
}

Далее List.ReplaceMatchingItems находит в своем первом аргументе все русские буквы "в" и меняет их на сопоставленные ей "v", "г" на "g" и т.п.
F1 творит чудеса
 
Максим Зеленский, я правильно понимаю, что через данную функцию можно будет сделать и обратную конвертацию с транслита на русский, только сначала нужно пробежаться по двухбуквенным сочетаниям, а уже после по однобуквенным?
Вот горшок пустой, он предмет простой...
 
PooHkrd, нет, напрямую не получится. Как вы сформируете для нее список, в котором будете производить замену? Если брать ее буквально, то Text.ToList разобьет строку по 1 символу, то есть никаких двухбуквенных сочетаний не будет. Значит, надо бить по двухбуквенным скользящим способом?.. А там есть и 4-буквенные замены

Но есть и другие решения для таких случаев. Например, у Ивана Бондаренко: https://bondarenkoivan.wordpress.com/2015/04/16/multiple-replacements-of-words-in-power-query/ и в статьях Криса (ссылки в посте Ивана).

Да и тут можно, я думаю, сделать что-то еще. Сейчас поэкспериментирую.
F1 творит чудеса
 
Максим Зеленский, Спасибо!  
 
Накидал свой вариант с комментариями и пояснениями: Замена значений по списку в PowerQuery
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Коллеги, познавательно. У меня вопрос: у каждого своя таблица соответствия или есть общепринятая (для транслитерации)?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, Сравнительная таблица систем транслитерации
F1 творит чудеса
 
The_Prist, добавил комментарий к статье - можно сильно сократить функцию на этапе сортировки:
Код
translate_table = Excel.CurrentWorkbook(){[Name="translate_list"]}[Content],
SortTranslation = Table.Sort(translate_table, each -Text.Length(Record.Field(_, WhatChange))),
t1=Table.Column(SortTranslation, WhatChange),
t2=Table.Column(SortTranslation, ChangeWith),
// и так далее
F1 творит чудеса
 
Максим, спасибо. Буду посмотреть :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Наткнулся в Интернете на вот такое решение:
https://semtools.guru/ru/change-replace-tools/change-symbols/cyr-lat-lat-cyr/

Код
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(
A1;
"А";"A");"Б";"B");"В";"V");"Г";"G");"Д";"D");"Е";"E");"Ё";"Yo");"Ж";"Zh");"З";"Z");"И";"I");"Й";"Y");
"К";"K");"Л";"L");"М";"M");"Н";"N");"О";"O");"П";"P");"Р";"R");"С";"S");"Т";"T");"У";"U");"Ф";"F");
"Х";"Kh");"Ц";"Ts");"Ч";"Ch");"Ш";"Sh");"Щ";"Sch");"Ы";"Y");"Э";"E");"Ю";"Yu");"Я";"Ya");"а";"a");
"б";"b");"в";"v");"г";"g");"д";"d");"е";"e");"ё";"yo");"ж";"zh");"з";"z");"и";"i");"й";"y");"к";"k");
"л";"l");"м";"m");"н";"n");"о";"o");"п";"p");"р";"r");"с";"s");"т";"t");"у";"u");"ф";"f");"х";"kh");
"ц";"ts");"ч";"ch");"ш";"sh");"щ";"sch");"ъ";"y");"ы";"y");"ь";"");"э";"e");"ю";"yu");"я";"ya")
 
SAG, а если бы у нас букв в алфавите было 10К?
Страницы: 1
Читают тему
Наверх