PowerShell: транслитерация по-быстрому
При работе с подрядчиками пришлось разбирать кучу файлов от них, названных транслитом, и раскладывать их по папкам нашего архива. Уж очень быстро и просто получилась транслитерация на powershell, поэтому решил написать.
Произвольная транслитерация
Сразу приведу кусок сценария, отвечающий за транслитерацию. Прошу прощения, что не оформил его ещё правильно – функцией, модулем и так далее. Позднее оформлю
$translator = @{ 'A'='А'; 'B'='Б'; 'C'='С'; 'D'='Д'; 'E'='Е'; 'F'='Ф'; 'G'='Г'; 'H'='Н'; 'I'='И'; 'J'='Й'; 'K'='К'; 'L'='Л'; 'M'='М'; 'N'='Н'; 'O'='О'; 'P'='П'; 'Q'='К'; 'R'='Р'; 'S'='С'; 'T'='Т'; 'U'='У'; 'V'='В'; 'W'='В'; 'X'='Х'; 'Y'='У'; 'Z'='З'; '0'='0'; '1'='1'; '2'='2'; '3'='3'; '4'='4'; '5'='5'; '6'='6'; '7'='7'; '8'='8'; '9'='9'; '.'='.'; '-'='-'; }; $translatedId = ( $id -split '' | % { $translator[$_]; } ) -join '';
Не считая самой таблицы транслитерации, сама транслитерация – в одну строку
P.S. Не обращайте внимания на саму таблицу транслитерации. Она далеко не по ГОСТу. Пришлось из транслита подрядчика в кириллические обозначения наши переводить. Поэтому и таблица далеко не “стандартная”.
Транслитерация по ГОСТ Р 52535.1-2006 и не только
Однако, может потребоваться решать и другую задачу – транслитерация кириллицы по ГОСТ (у меня возникла – при генерации по ФИО учётной записи и lname для адреса электронной почты). В Википедии можно почерпнуть массу правил транслитерации кириллицы, и в разных случаях следует использовать разные правила. Посему и предлагаю Вашему вниманию модуль powershell, позволяющую осуществить транслитерацию как по предопределённым таблицам транслитерации, так и по Вашим собственным.
Для транслитерации по ГОСТ Р 52535.1-2006 (используется при транслитерации ФИО в загранпаспортах) используем таблицу А1.
Source | Translit |
---|---|
А | A |
Б | B |
В | V |
Г | G |
Д | D |
Е | E |
Ё | E |
Ж | ZH |
З | Z |
И | I |
Й | I |
К | K |
Л | L |
М | M |
Н | N |
О | O |
П | P |
Р | R |
С | S |
Т | T |
У | U |
Ф | F |
Х | KH |
Ц | TC |
Ч | CH |
Ш | SH |
Щ | SHCH |
Ъ | |
Ы | Y |
Ь | |
Э | E |
Ю | IU |
Я | IA |
Приведу для начала код, который будет использовать наш модуль, а затем и код самого модуля:
Import-Module ` (join-path ` -path ( ( [System.IO.FileInfo] ( $myinvocation.mycommand.path ) ).directory ) ` -childPath 'ITG.Translit' ` ) ` -force ` ; 'Бетке','Сергей','Сергеевич' | convertTo-Translit
Код самого модуля выглядит следующим образом:
set-variable ` -name GOST_R_52535_A1 ` -option constant ` -value ` @{ 'А'='A'; 'Б'='B'; 'В'='V'; 'Г'='G'; 'Д'='D'; 'Е'='E'; 'Ё'='E'; 'Ж'='ZH'; 'З'='Z'; 'И'='I'; 'Й'='I'; 'К'='K'; 'Л'='L'; 'М'='M'; 'Н'='N'; 'О'='O'; 'П'='P'; 'Р'='R'; 'С'='S'; 'Т'='T'; 'У'='U'; 'Ф'='F'; 'Х'='KH'; 'Ц'='TC'; 'Ч'='CH'; 'Ш'='SH'; 'Щ'='SHCH'; 'Ь'=''; 'Ы'='Y'; 'Ъ'=''; 'Э'='E'; 'Ю'='IU'; 'Я'='IA'; } ` ; function ConvertTo-Translit { <# .Synopsis Выполняет транслитерацию исходной строки в соответствии с выбранными правилами транслитерации. .Description Данная функция выполняет транслитерацию исходной строки в соответствии с выбранными правилами транслитерации. .Parameter String Исходная строка, к которой будут применены правила транслитерации. .Parameter TranslitRules Таблица транслитерации. .Example Создание группы сервисов: "Бетке","Сергей","Сергеевич" | ConvertTo-Translit #> param ( [Parameter( Mandatory=$true, Position=0, ValueFromPipeline=$true, HelpMessage='Исходная строка, к которой будут применены правила транслитерации.' )] [string]$String, [Parameter( Mandatory=$false, Position=1, ValueFromPipeline=$false, HelpMessage='Таблица транслитерации.' )] $TranslitRules = $GOST_R_52535_A1 ) process { ( ` $String -split '' ` | % { if ( $TranslitRules.ContainsKey( $_ ) ) { $TraslitStr = $TranslitRules[$_]; if ( [System.Char]::IsUpper( $_ ) ) { $TraslitStr.ToUpper(); } else { $TraslitStr.ToLower(); }; } else { $_; }; } ` ) -join ''; } } function ForEach-Key { <# .Synopsis Конвертация таблицы транслитерации (да и не только) в массив объектов с целью дальнейшей сериализации. .Parameter InputObject Таблица транслитерации. .Example $GOST_R_52535_A1 | ForEach-Key | ConvertTo-HTML -Fragment #> param ( [Parameter( Mandatory=$true, Position=0, ValueFromPipeline=$true, HelpMessage='Таблица транслитерации.' )] $InputObject ) process { $InputObject.keys ` | Select-Object -Property @{ Name='Source'; Expression={ $_; } }, @{ Name='Translit' Expression={ $InputObject[$_]; } } ` | Sort-Object 'Source' ; } } Export-ModuleMember ` ConvertTo-Translit ` , ForEach-Key ;
Функция ForEach-Key конвертирует хеш-таблицу в поток объектов PS с тем, чтобы получить в нужном виде вывод. В примере приведён вывод в HTML (таблица транслитерации выше в статье именно с помощью этой функции и построена).
Вот такая вот транслитерация на PowerShell.
Отзывы » (2)
RSS комментарии
Обратная ссылка
Спасибо — отлично работает!
Для транслитерации с украинского можно использовать например такой сервисkmu-translite.co.ua. Часто применяю на работе т.к нужно переводить имена и фамилии.