Quantcast
Channel: なんでもエクセル(Nandemo Excel)
Viewing all articles
Browse latest Browse all 52

Power Query:カタカナをローマ字表記に変換する

$
0
0

「カタカナをローマ字表記に変換する」記事は時々あります。数式でも WebAPIの力を借りれば簡単にできます。とはいえデータが個人情報の場合は、WebAPIで検索表示させるのは情報漏洩のリスクがあるので、避けたい向きもあるのではないでしょうか。というわけで今回はこれをクエリでやったいと思います。

単純には置換リストを作って置き換えればいいので、例外処理を除けばそんなに難しい話ではありません。ただし、何をおいてもまずは変換リストを作る必要があります。

自分で作ってもらっても全く問題ないんですが、面倒な方は下のコードを新規クエリの詳細エディタにコピー&ペーストしてください。

変換リスト(ヘボン式基本):全角カタカナの場合
Json.Document(     Binary.Decompress(Binary.FromText("bZTLbuJAFET/hXUWZBwnzHI8gB0s2xFgUEiyaL/+IP8fqsfqPr6aDVIXcLp8b7k+Plaf38l66lcPq9XXw7/T8KTP8eWuvb03Vk693Fo58fKfKCcBkhGSBEhGSBIgGSD9rwA5NFYV49BaVYhDJHSb/xFm1RBm1RLWXh3van61sns0shvDfTkee5ZTL7dWTrwcIZMfqft9ly+NVYW+7KwqxOXVqnJ3gbkpPEoJz0Marts3VtV1+51Vdd3+1aq6bh+5owuzOGIWs5x6ubVy4mWYixEomKOYgYI5iiEomKMuQGpAZjn1cmvlxMuAPAbI36Kxcurl1sqJlxGblwA5ATLLqZdbKydexh6HACkZsiFASoZsCJASj+Oew9avjVWFvu6sKsQ1bt3FQL4jIYOaAJtyOuN73yvsD52RJaXoDQFQN2XgyXEG3rPOrBKdwVvrjDXq/1vsT362kddrfjf2ivog8nrxttioXqcbVim/t8jr3JLXbZa8Tv5v4GkeOXi6PwdP9+fsEJ2xFd2fs0xUAvH3k3hoFY0bdSJ6hI2TVo5XWss94l3WZcf497HTmS+1zuBp+EfwNAx2g4bBUpB5hHaU+Qq/l/sK98t+hTDIf4UwaFgVwiW/eA8H+SlYd6o09ou+RxjEx5vZi18jXJpXjXBpXjWrRmfwNK8aPPk5g6f5nMHTfM4n1o4vHMRLDs+IlxydEC85OCFe2tCJFeTLB0BfUgD6YgFQDkp0hwyUrCOdkVcZKNFLbpFPt1nk02kAgD0t4uq0njvq6wc=", BinaryEncoding.Base64), Compression.Deflate) )
変換リスト(ヘボン式基本):半角カタカナの場合
Json.Document(     Binary.Decompress(Binary.FromText("dZXNUsJAEITfhbMHJJhNjoLACkVigUiJetD8vIHv7/agO53ZeKFqepJvMtlO8/Y2ef/uezed3EwmHzfXqvjCb9njN+9C5+m1Hm+20jyNNxtp3ttmF7GLFNtF7CLFdhG7YOytwW7r8R6o29N4D9CtMl3zP3PQM8xBzzKLv1427cDcnMea4UZnm848zYZe3KDZSvM03myk+YfNpv1c5K8gv9RW/YS6smoB9dGqeN6X4S6/K+5oi6KJ49a1VTFuvbIqxq0frYpxa+WWRXwvB3ovv3Ir8snKjcjWmwLxiSsF4hM/CsQzJI+QiiF5hFQMySOkSuwskKW3ThbI0lsTC2TprX8FcvTWugI5eutagRy9tZ1AdonhBLJLrCaQHa3jsnjq59qqOPXzyqo49bOeupvFa1/JId01aZAx9JZaVa2brmqaVVDJY5+q3ttpElrJNFGTaaKmEQY1mSYqTZtH9YGmZarStFlUL2m2IYFo2lQJdEK9EuiEdOMLnVA7Ns01Y9OcbnyhabrxhqaVqtK0QtU006DStFxVjjhEk96b56GmrLsNJYUc/gUVWcLLFGAlTHyghIElD/q4ZYmaowY18RBcB+LhYTix7lDT/Xh4+pTKLNR7un6GmuZjmz3dj3X2dPww9Z5NjfxiO6NmIyNo2cLos3lREw/7V8TD/hXxsH/FAYiaeNi/4s8g1M/8AaBm66M+suslBtnwuIKtjohjk6Nme6NmY0sksqchsJsRd+xj1Oxg1Oxd1Oxa1MS7I3+Gck7+RD6GkmCzgV0dtg+ojx8=", BinaryEncoding.Base64), Compression.Deflate) )

今回は、文字数の多い順に置換するので(「し」よりは「しゃ」優先)、50音降順で並べています。

後は新規クエリを作成して入力表を読み込んで、一文字ずつ置き換えしてから促音の処理を付け加えればいいでしょう。

ローマ字変換(基本)
let     ソース = 入力表,     変換列の追加 = Table.AddColumn(         ソース,         "ローマ字変換",         each List.Accumulate(             変換リスト,             [文字],             (x, y)=> Text.Replace(x, y{0}, y{1})         ),         type text     ),     変換列の編集 = Table.TransformColumns(         変換列の追加, {"ローマ字変換", each [             位置 = Text.PositionOf(_, "ッ"),             置換 = Text.ReplaceRange(_, 位置, 1, Text.Range(_, 位置+1, 1)),             条件選択 = if 位置=-1 then _ else 置換         ][条件選択]     }) in     変換列の編集

単純にはこれでおしまいです。後は「『OO』は『O』に変換」のような例外処理を追加していけばいいだけです。ヘボン式なら例外処理は後回しにして、リストを作って置換するだけでもいいですね。

ローマ字変換ヘボン式
let     設定 = [         ヘボンA = {{"NB", "MB"}, {"NP", "MP"}, {"NM", "MM"}},         ヘボンB = {{"OO", "O"}},         ヘボンC = {{"OU", "OH"}},         ヘボンD = {{"UU", "U"}},         ヘボンE = {{"CCH", "TCH"}}     ],     置換 = (A as list, B as text)=>         List.Accumulate(A, B, (x, y)=> Text.Replace(x, y{0}, y{1})),     ソース = 入力表,     ローマ字変換列の追加 = Table.AddColumn(         ソース,         "ローマ字変換",         each List.Accumulate(             変換リスト,             [文字],             (x, y)=> Text.Replace(x, y{0}, y{1})         ),         type text     ),     ローマ字変換列の編集 = Table.TransformColumns(         ローマ字変換列の追加, {"ローマ字変換", each [             促音変換 = [                 位置 = Text.PositionOf(_, "ッ"),                 文字 = Text.Range(_, 位置+1, 1),                 置換 = Text.ReplaceRange(_, 位置, 1, 文字),                 条件選択 = if 位置=-1 then _ else 置換             ][条件選択],             ヘボン設定A = 置換(設定[ヘボンA], 促音変換),             ヘボン設定B = 置換(設定[ヘボンB], ヘボン設定A),             ヘボン設定C = 置換(設定[ヘボンC], ヘボン設定B),             ヘボン設定D = 置換(設定[ヘボンD], ヘボン設定C),             ヘボン設定E = 置換(設定[ヘボンE], ヘボン設定D)         ][ヘボン設定E]}     ),     列の選択 = Table.SelectColumns(ローマ字変換列の編集, {"ローマ字変換"}) in     列の選択集

訓令式の場合は、「ん」の後に母音(もしくは「Y」)がきた時は、「'(アポストロフィ)」を入れる必要があるので、「ん」の処理だけ後に回す必要があります。なので訓令式用の変換リストでは「ん」をわざと除いて、置換を後回しにします。

変換リスト(訓令式基本)
Json.Document(     Binary.Decompress(Binary.FromText("bZTRbqpQEEX/xefeREup9vESFRoCNoKa2tuHg8Af3P+v+5TMWZz2xWS2umaY2eyPj8W//8lyvC0eFn8Wnw/fZf+kz2F9F9/eD7GcevkUy4mX/wY5MUhGSGKQjJDEIBkgt0eDXAGZ5NTLp1hOvBwg3eZXyCTHkEn+AVl6ebjL+SWW3SqS3WAtc7Sc5NTLp1hOvBwgo1+se7nL50OsCn3exaoQ59dY1XRnDDfao5SYuU+t3f4Qq2q338Wq2u1fY1Xt9oE7ONvFEbuY5NTLp1hOvIzhghEKuikYoaCbghEKuqkzSE03dQap6abOIDUhK4O0hKwM0hKyMkhLN60N0tCSa4M0tOTaIA0grjdISZP1Bilpst4gJSHPdvXLIVaFvuxiVYhLuLoLhnyHQ3rlAS7lVON7ny5MEdXwklz0BgMoojLwNHEG3rNqBopq8JaqcUb9f4v7aZ5t4N18LjBbVAfeTbwtLqrX6YpTat5r4HVuzus2c16n+a/gaR85eOqfg6f+OTNENa6i/jnDRCEQfj+Kh1TRuhEnogfYMOrkeKV13CPeZTU7hr8PnWq+1KrB0/KP4GkZzAYtg6Gg4WHaQcNX+L2mr9Bf41cwg+avYAYtq4K5NG8Bc2megnGnmvmiGmYQv4C5xK9hLu2rhrm0r5pRoxo87asGT/O04Gk/LXjaT8vUUQ1zab4W5tI8Dcyl/g3Mpfs0DCDV4PmEAs+nCnjqXyI41L9kFqmGWdW/RCi5mTndZmZOp6cH7GnmVafb3FGfXw=="), Compression.Deflate) )

やること自体は同じで、変換する内容が違ってくるだけです。長音がある時は「̂(サーカムフレックス)」を入れるルールがありますが、これもリストの置換で問題ありません。

ローマ字変換訓令式
let     設定 = [         訓令A = {             {"ん", "ン"}, {"ンA", "N'A"}, {"ンI", "N'I"}, {"ンU", "N'U"},             {"ンE", "N'E"}, {"ンO", "N'O"}, {"ンY", "N'Y"}, {"ン", "N"}         },         訓令B = {             {"A-", "Â"}, {"I-", "Î"}, {"U-", "Û"},             {"E-", "Ê"}, {"O-", "Ô"}         },         訓令C = {{"Î", "II"}}     ],     置換 = (A as list, B as text)=>         List.Accumulate(A, B, (x, y)=> Text.Replace(x, y{0}, y{1})),     ソース = 入力表,     ローマ字変換列の追加 = Table.AddColumn(         ソース,         "ローマ字変換",         each List.Accumulate(             変換リスト,             [文字],             (x, y)=> Text.Replace(x, y{0}, y{1})         ),         type text     ),     ローマ字変換列の編集 = Table.TransformColumns(         "ローマ字変換", each [             促音変換 = [                 位置 = Text.PositionOf(_, "ッ"),                 文字 = Text.Range(_, 位置+1, 1),                 置換 = Text.ReplaceRange(_, 位置, 1, 文字),                 条件選択 = if 位置=-1 then _ else 置換             ][置換],             訓令設定A = 置換(設定[訓令A], 促音変換),             訓令設定B = 置換(設定[訓令B], 訓令設定A),             訓令設定C = 置換(設定[訓令C], 訓令設定B)         ][訓令設定C]}     ),     列の選択 = Table.SelectColumns(ローマ字変換列の編集, {"ローマ字変換"}) in     列の選択集

以上です。必要か分からない設定は分けてありますので、いらなければレコードの処理から設定を抜いてください。設定用のテーブルを別に作って、切り替えできるように作ってもいいと思います。


Viewing all articles
Browse latest Browse all 52

Trending Articles