【データ加工・変換 No.3】半角カタカナ⇔全角カタカナの変換

【データ加工・変換 No.3】半角カタカナ⇔全角カタカナの変換

Goanywhere2023.06.26

半角カタカナ⇔全角カタカナの変換

はじめに

GoAnywhereMFTは、システム間、取引先間における多種多様なデータ・ファイル連携を実現するソリューションです。

データ・ファイル連携において、それぞれ異なる形式のデータを持つ各システムに合わせたデータの加工や変換は必要不可欠となります。GoAnywhereはデータの加工・変換機能も持っており、GoAnywhereはデータの抽出・加工・変換からファイルの転送まで一元的に管理可能です。

【GoAnywhereのデータ加工・変換機能】

  • 異なる拡張子ファイルへの変換
  • ファイルの文字コードの変換
  • 日付や数字等のフォーマットの変換
  • トリム処理
  • 文字の置換処理
  • 新しいカラムの追加・削除・結合
  • 変換テーブルを利用して値の変換
しかし、実際にデータ・ファイル連携する際には、他にも様々な種類のデータ加工・変換が必要となります。

本記事では、JavaScript等の一般的な開発言語で実装可能な方法を参考に、GoAnywhereMFTでも半角カタカナ⇔全角カタカナの変換が可能か試してみました。

一般的な開発言語の場合の実現方法

カタカナ

カタカナは半角文字と全角文字が文字コード上で対応する並びになっていないため、英数字のように16進数の足し引きで変換することが不可能です。そのため、マッピングを作成する必要があります。

(例:JavaScript)半角文字⇒全角文字
  
Hankaku = Hankaku.replace(/[。-゚]/g, function(s) {
  var HankakuMap = {
    'ガ': 'ガ', 'ギ': 'ギ', 'グ': 'グ', 'ゲ': 'ゲ', 'ゴ': 'ゴ',
    'ザ': 'ザ', 'ジ': 'ジ', 'ズ': 'ズ', 'ゼ': 'ゼ', 'ゾ': 'ゾ',
    'ダ': 'ダ', 'ヂ': 'ヂ', 'ヅ': 'ヅ', 'デ': 'デ', 'ド': 'ド',
    'バ': 'バ', 'ビ': 'ビ', 'ブ': 'ブ', 'ベ': 'ベ', 'ボ': 'ボ',
    'パ': 'パ', 'ピ': 'ピ', 'プ': 'プ', 'ペ': 'ペ', 'ポ': 'ポ',
    'ヴ': 'ヴ', 'ヷ': 'ヷ', 'ヺ': 'ヺ',
    'ア': 'ア', 'イ': 'イ', 'ウ': 'ウ', 'エ': 'エ', 'オ': 'オ',
    'カ': 'カ', 'キ': 'キ', 'ク': 'ク', 'ケ': 'ケ', 'コ': 'コ',
    'サ': 'サ', 'シ': 'シ', 'ス': 'ス', 'セ': 'セ', 'ソ': 'ソ',
    'タ': 'タ', 'チ': 'チ', 'ツ': 'ツ', 'テ': 'テ', 'ト': 'ト',
    'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ',
    'ハ': 'ハ', 'ヒ': 'ヒ', 'フ': 'フ', 'ヘ': 'ヘ', 'ホ': 'ホ',
    'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ',
    'ヤ': 'ヤ', 'ユ': 'ユ', 'ヨ': 'ヨ',
    'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
    'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン',
    'ァ': 'ァ', 'ィ': 'ィ', 'ゥ': 'ゥ', 'ェ': 'ェ', 'ォ': 'ォ',
    'ッ': 'ッ', 'ャ': 'ャ', 'ュ': 'ュ', 'ョ': 'ョ',
    '。': '。', '、': '、', 'ー': 'ー', '「': '「', '」': '」', '・': '・'
  };
  
  var reg = new RegExp('(' + Object.keys(HankakuMap).join('|') + ')', 'g');
  return s
            .replace(reg, function (match) {
                return HankakuMap[match];
            })
            .replace(/゙/g, '゛')
            .replace(/゚/g, '゜');
});
  
(例:JavaScript)全角文字⇒半角文字
  
Zenkaku = Zenkaku.replace(/[ァ-ヶ。、ー「」・]/g, function(s) {
  var ZenkakuMap = {
    "ガ": "ガ", "ギ": "ギ", "グ": "グ", "ゲ": "ゲ", "ゴ": "ゴ",
    "ザ": "ザ", "ジ": "ジ", "ズ": "ズ", "ゼ": "ゼ", "ゾ": "ゾ",
    "ダ": "ダ", "ヂ": "ヂ", "ヅ": "ヅ", "デ": "デ", "ド": "ド",
    "バ": "バ", "ビ": "ビ", "ブ": "ブ", "ベ": "ベ", "ボ": "ボ",
    "パ": "パ", "ピ": "ピ", "プ": "プ", "ペ": "ペ", "ポ": "ポ",
    "ヴ": "ヴ", "ヷ": "ヷ", "ヺ": "ヺ",
    "ア": "ア", "イ": "イ", "ウ": "ウ", "エ": "エ", "オ": "オ",
    "カ": "カ", "キ": "キ", "ク": "ク", "ケ": "ケ", "コ": "コ",
    "サ": "サ", "シ": "シ", "ス": "ス", "セ": "セ", "ソ": "ソ",
    "タ": "タ", "チ": "チ", "ツ": "ツ", "テ": "テ", "ト": "ト",
    "ナ": "ナ", "ニ": "ニ", "ヌ": "ヌ", "ネ": "ネ", "ノ": "ノ",
    "ハ": "ハ", "ヒ": "ヒ", "フ": "フ", "ヘ": "ヘ", "ホ": "ホ",
    "マ": "マ", "ミ": "ミ", "ム": "ム", "メ": "メ", "モ": "モ",
    "ヤ": "ヤ", "ユ": "ユ", "ヨ": "ヨ",
    "ラ": "ラ", "リ": "リ", "ル": "ル", "レ": "レ", "ロ": "ロ",
    "ワ": "ワ", "ヲ": "ヲ", "ン": "ン",
    "ァ": "ァ", "ィ": "ィ", "ゥ": "ゥ", "ェ": "ェ", "ォ": "ォ",
    "ッ": "ッ", "ャ": "ャ", "ュ": "ュ", "ョ": "ョ",
    "。": "。", "、": "、", "ー": "ー", "「": "「", "」": "」", "・": "・"
  };
  
  var reg = new RegExp('(' + Object.keys(ZenkakuMap).join('|') + ')', 'g');
  return s
            .replace(reg, function (match) {
                return ZenkakuMap[match];
            })
            .replace(/゛/g, '゙')
            .replace(/゜/g, '゚');
});
  

VB.NET等の一部言語では、標準的に文字変換の関数やメソッドが既に用意されており、容易に半角文字⇔全角文字の変換が可能です。
(例)VB.NET
StrConv関数:StrConv(String, VbStrConv, Int32)
・半角文字⇒全角文字
 StrConv('アイウエオ', VbStrConv.Wide)
・全角文字⇒半角文字
 StrConv('アイウエオ', VbStrConv.Narrow)

GoAnywhereでやってみた

上記で紹介したマッピングを活用して、GoAnywhereでもカタカナの半角文字⇔全角文字の変換をやってみます。
以下の3つの処理によって変換を実装します。

  1. マッピング用の変数を定義(タスク:Set Variable)
  2. 対象の文字がマッピング上で何文字目に存在するか取得(関数:PositionOf)
  3. マッピングから対応する変換後の文字を取得(関数:Substring)

3つの処理

  1. マッピング用の変数を定義(タスク:Set Variable)

    タスク「Set Variable」を使用し、マッピング用の変数を定義します。
    (例)半角カタカナ⇒全角カタカナへの変換マッピング
    変数名:HankakuMap
    値:。。「「」」、、・・ヲヲァァィィゥゥェェォォャャュュョョッッーーアアイイウウエエオオカカキキククケケココササシシススセセソソタタチチツツテテトトナナニニヌヌネネノノハハヒヒフフヘヘホホママミミムムメメモモヤヤユユヨヨララリリルルレレロロワワンン゙゛゚゜
    (例)全角カタカナ⇒半角カタカナへの変換マッピング
    変数名:ZenkakuMap
    値:。。「「」」、、・・ヲヲァァィィゥゥェェォォャャュュョョッッーーアアイイウウエエオオカカキキククケケココササシシススセセソソタタチチツツテテトトナナニニヌヌネネノノハハヒヒフフヘヘホホママミミムムメメモモヤヤユユヨヨララリリルルレレロロワワンン゛゙゜゚

    タスク「Set Variable」:任意の変数を定義する

  2. 対象の文字および対応する変換後の文字がマッピング上で何文字目に存在するか取得(関数:PositionOf)

    関数「PositionOf」を使用することで、文字列の中で対象の文字が最初に何文字目に存在するか取得します。

    (例)マッピング(HankakuMap)上で「ア」が存在する文字番号を取得
    ${PositionOf(HankakuMap, 'ア')} ⇒ 33

    (例)マッピング(HankakuMap)上で「ア」を全角に変換した文字「ア」が存在する文字番号を取得
    ${PositionOf(HankakuMap, 'ア') + 1} ⇒ 34

    関数「PositionOf」:指定した文字列(1つ目のパラメータ)から検索文字(2つ目のパラメータ)が最初に存在する文字番号を取得する


  3. マッピングから対応する変換後の文字を取得(関数:Substring)

    関数「Substring」を使用することで、文字列から指定の文字数の文字を取得します。

    (例)マッピング(HankakuMap)から「ア」(「ア」を全角に変換した文字)を取得
    ${Substring(HankakuMap, 34, 1)} ⇒ ア
    ${Substring(HankakuMap, PositionOf(HankakuMap, 'ア') + 1, 1)} ⇒ ア

    関数「Substring」:指定した文字列(1つ目のパラメータ)から、文字番号(2つ目のパラメータ)から文字数(3つ目のパラメータ)分の文字を取得する

3つ処理を一つの処理に統合

GoAnywhereの関数では、入れ子式に関数を使用することが可能なため、最終的には以下のように指定することができます。

(例)「ア」⇒「ア」に変換
${Substring(HankakuMap, PositionOf(HankakuMap, '[半角カタカナ]') + 1, 1)}
※[半角カタカナ]:任意の半角カタカナの1文字

まとめ

GoAnywhereでも関数の組み合わせによって、カタカナ⇔ひらがなの変換ができました。

【半角カタカナ⇒全角カタカナ】

${Substring(HankakuMap, PositionOf(HankakuMap, '[半角カタカナ]') + 1, 1)}
※[半角カタカナ]:任意の半角カタカナの1文字
プロジェクト画面(半角カタカナ⇒全角カタカナ)

ジョブログ画面(半角カタカナ⇒全角カタカナ)


【全角カタカナ⇒半角カタカナ】

${Substring(ZenkakuMap, PositionOf(ZenkakuMap, '[全角カタカナ]') + 1, 1)}
※[全角カタカナ]:任意の全角カタカナの1文字
プロジェクト画面(全角カタカナ⇒半角カタカナ)

ジョブログ画面(全角カタカナ⇒半角カタカナ)
※2文字以上を一括で変換する場合は、処理を更新する必要があります。2文字以上のデータの一括変換等については、製品サポートにお問い合わせください。