Статья размещена автором Бетке Сергей Сергеевич

PowerShell: транслитерация по-быстрому

При работе с подрядчиками пришлось разбирать кучу файлов от них, названных транслитом, и раскладывать их по папкам нашего архива. Уж очень быстро и просто получилась транслитерация на 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 '';

Не считая самой таблицы транслитерации, сама транслитерация – в одну строку PowerShell: транслитерация по быстрому

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)

  1. Anton Krouglov:

    Спасибо — отлично работает!

  2. Для транслитерации с украинского можно использовать например такой сервисkmu-translite.co.ua. Часто применяю на работе т.к нужно переводить имена и фамилии.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка