TOPICS

トピック

データ活用に課題はありませんか?読みながら学べる記事を多数ご用意しております。

  1. 純国産ETLツールのWaha!Transformer
  2. TOPICS
  3. データ交換ノウハウ:メインフレームからの負のアンパック数値が文字化けする

記事公開日

最終更新日

  • LINEで送る
  • このエントリーをはてなブックマークに追加

データ交換ノウハウ:メインフレームからの負のアンパック数値が文字化けする

データ交換ノウハウ:メインフレームからの負のアンパック数値が文字化けする

(本記事の情報は、記事の公開日時点での情報であり、その正確性、完全性、最新性等内容を保証するものではありません。)

メインフレームからの交換データで、数値フィールドの1桁目がアルファベットになっているので、数値として読み込めないことがあります。
これは、COBOL等で生成したファイルをそのまま転送ツールの文字コード変換にかけて生成したのが原因と考えられます。

COBOLでよく使用される数値型にはパックとゾーン(アンパック)があります。<br/ > パックは、8ビットの上位下位をそれぞれ数値の一桁とし、1桁目を符号とします。
小数点位置は固定で、扱うアプリがフォーマットで定義します。つまり、データ中には小数点位置は記載されません。

COBOLデータ定義

アンパック(ゾーン)は、数値のキャラクタをそのまま書きますが、数値が負の場合のみ、1桁目にマスクがかかります。小数点の扱いはパックと同様です。

COBOLデータ定義

メインフレームでは数値文字列(「-1.123」のように見たままの形式)は可変長表現であることからあまり使用されないため、COBOLでデータ生成をする場合にはたいていパックかゾーンになります。パックはバイナリ表現のためデータのレコードレイアウトを意識しないとコード変換ができないため、ゾーンを使用する事が多いという事情があります。

問題は、サンプルデータが正の数値ばかりである場合、単純なEBCDIC/ASCIIのコード変換で大丈夫だろうと判断されてしまったことでしょう。

EBCDICでアンパック

IBM COBOLのEBCDICのゾーンの場合、符号桁の上位4ビットは正の数の場合が0xF、負の数の場合が0xDなので、単純にコード変換した場合、相当する文字コードに変換されてしまいます。

負の符号桁は、ちょうどアルファベットの「}」から「R」に相当するため、変換後のASCIIデータの1桁目がアルファベットになるわけです。

符号桁をそのままコード変換したものと正しいASCII符号との対比

幸い、マスク後のデータは文字コードとして有効ですから、プログラムで判断する場合は、数値の1桁目がASCIIの数値コードに該当しない場合は負の数値として扱うことで対処できます。

一方、UNIXやWindows系のCOBOLでそのままデータを使用する場合は変換が必要です。
符号ビットは6ビット目が1になるという説もありますが、実はコンパイラメーカーごとに定義がバラバラで、単純変換した文字コードとも異なるためです。

データ提供元の人々は自分の言葉と常識で語るので、データ変換の仕様策定を行う場合には、相手先プラットフォームについての知識が必要になってくるわけです。

追記:Waha! Transformer 製品サイトの関連コンテンツ

Waha! Transformer の対応データソースと対応文字コード体系

『Waha! Transformer概要資料』

データの抽出や加工、連携にお悩みではありませんか?

純国産ETLの決定版!25年以上の実績。異なる形式のデータをスムーズに連携・統合するノーコードETL:データ連携ツール「Waha! Transfomer」概要資料はこちら。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

Contact

社内のデータ活用でお悩みの方は
お気軽にご相談ください。

お問い合わせ

データ活用について
理解を深める

Waha! Transformerの紹介だけではなく、あらゆる業務テーマをターゲットにしたデータ活用関連の情報収集ができます。

資料ダウンロード

トピック

データ活用に課題はありませんか?読みながら学べる記事を多数ご用意しております。

トピックを読む

無料体験版

14日間利用できる無料体験版ライセンスです。データ抽出・変換・ロードを実際にご体験ください。

体験版に申し込む