はじめに
DataMagic は、色々な機能を備えています。
機能・概要一覧
| 機能 | 概要 |
|---|---|
| マッチング | 入力ファイルのレコードと、共通する項目名をキーにした複数のマッチングファイルのレコードを結合し、一つのデータセットとして出力する |
| マージ | 入力ファイルとマージファイルを連結して、入力マージデータとして取り扱えます。入力マージデータに対しては、データ加工前に重複行の削除やソートする |
| 出力先振り分け | 抽出条件に沿って、出力ファイルを振り分ける |
| 数値項目演算 | 出力項目が数値タイプの場合、入力項目同士や任意の値との演算式を指定し、その演算結果を出力項目の値として出力する |
| データ抽出 | 入力データから、指定した条件に合致したデータのみを抽出する |
| 項目入替 | 入力データの項目を入れ替えて、別のフォーマットで出力する |
| 項目結合 | 複数の項目を結合して、1つの項目として出力する |
| 項目分割 | 単一項目を分割して、複数の項目として出力する |
| 全角半角 | 「カナ」「英数字」および「記号」を、半角から全角、全角から半角へ変換する |
| 出力フォーマット指定 | 日付型、数字文字列型の入力項目を出力する際に、フォーマットを指定する |
| 入力ソート | 入力ファイルの形式がCSV、フォーマット、Excelの場合は、データ加工の前にソートする |
| 属性変換 | 入力データを出力データに変換する際に、数値タイプを任意の数値タイプへ変換する |
| 日付項目演算 | 日付データに対して、演算や西暦⇔和暦の変換を指定し、その結果を出力項目の値として出力する |
| 関数 | 入力項目の値を関数で処理し、その処理結果を出力項目の値として出力する |
| マッピング | 入力ファイルから出力ファイルへのデータの流れや加工、変換ルールを定義し、異なるデータ形式間での項目の対応関係を設定する |
| 動的指定 | データ加工の実行時にコマンドの引数に指定した数値や文字列を、条件や出力情報に使用できる |
| ユーザ出口変換 | データを加工するときに、項目単位で独自の変換を設定するために、ユーザ出口プログラムを独自に作成できる |
| データ挿入 | レコード内の任意の項目にユーザ指定の任意の値を挿入できる |
| 仕様書出力 | データ加工の処理と設定内容を仕様書としてExcelファイルに出力できる |
| チュートリアル | データ加工の設定を対話的に実行して、DataMagicの基本的な操作方法を習得できる |
| カスタムエラー | カスタムエラー条件を使用すると、データの形式は問題ないが、意図しないデータ(例 別の事業所のデータ)を検出したときにデータ加工をエラーにできる |
| ステップ実行 | 入力ファイルの読み込み、抽出、およびデータ変換時に発生した、設定とデータの整合性が取れていないことに起因するエラー(システムエラーや設定値不正ではないもの)をスキップする |
| コード変換 | 1バイトコード間、または2バイトコード間で、文字コードを変換する |
今回の課題
以下の記事 ![]()
では、フォーマット形式の日付タイプと「日付の入力フォーマット」の関係について確認してみました。
がぁ、そもそも〝日付データ = 日付タイプ〟 とは限らない訳で。
日時のデータでも、数値や文字列として格納していることも。
特に、Mainframeで扱うファイルは、いかにレコード長を押さえて多くの情報を格納するかを考えるので、数字で表現できる情報はパック10進数(Pタイプ)にすることも少なくない。
実は、ある 有力筋 からも以下の情報が
DataMagicの「日付の入力フォーマット」機能は、ファイル形式や日付タイプか否かに関係なく、以下の処理で参照する入力データには全て適用されます。
- 日付演算
- 出力フォーマットに日付を選択
と言うことで、今回はこの情報
の裏どりをやってみます。
〝ファイル形式や日付タイプか否かに関係なく〟と言っても、【DataMagic】データ加工やってみた!日付の入力フォーマット ってなんだろう のエラー画像を見ると『日付文字列に変換できませんでした。』のメッセージが表示されているので、そもそも〝日付文字列に変換できる〟ことが前提 ![]()
ってことは、日付文字列
日付データに変えられる項目タイプは、以下の黄色のラインに
が付いている項目(と思われる)。
流石に全部試すのはご勘弁
いただき、
今回は 日付タイプ以外 の〝Bタイプ〟で検証してみます。
入力データ
入力データは、1999年02月14日18時15分45秒
を、以下のルールに従い作成してします。
- 項目1:西暦4桁(1999)
- 項目2:西暦4桁月2桁(199902)
- 項目3:西暦4桁月2桁日2桁(19990214)
- 項目4:西暦4桁月2桁日2桁時2桁(1999021418)
- 項目5:西暦4桁月2桁日2桁時2桁分2桁(199902141815)
- 項目6:西暦4桁月2桁日2桁時2桁分2桁秒2桁(19990224181545)
CF 07 DE 0C 03 00 C6 06 31 01 6A A5 26 77 77 9D 18 8B 2E 00 00 00 A9 82 9D 55 2E 12 00 00
コピーした16進数入力データは、こんな感じ
でバイナリエディタの16進数側(このエディタの場合は左側)にペーストしてください。
バイナリエディタが無い場合は、以下の変換元データを DataMagic の属性変換機能を使って、全項目Bタイプのフォーマットファイルに変換してください。
199919990219990214199902141819990214181519990214181545
ちなみに、この時の出力側のレイアウトは、以下
のレイアウト情報にあるフォーマット形式のレイアウトになります。
レイアウト情報
今回の入力データはフォーマット形式なので、省略はできません。
更に、バイナリはバイト数によって表現できる数値が以下のように異なります。
バイナリのバイト数と表現できる数値
-32,768 ~ +32,767 の範囲を表現
-2,147,483,648 ~ +2,147,483,647 の範囲を表現
-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 の範囲を表現
この点を考慮して、各項目のバイト数は以下の値で登録します。
また、今回の出力形式も CSV ですが、出力結果が見易いように、以下の内容でレイアウトを登録しました(勿論省略でも問題なしです)。
データ加工
1.入力ファイルエリアの編集
入力形式=フォーマット、漢字コード種=SHIFT-JIS
以下で説明する項目以外の設定は、初期値を採用します。
レイアウト
2.出力ファイルエリアの編集
出力設定
出力形式=CSV、漢字コード種=SHIFT-JIS
以下で説明する項目以外の設定は、初期値を採用します。
レイアウト
3.抽出条件の設定
初期設定のまま使用
4.関係線の設定1〔抽出条件と出力ファイル〕
抽出条件のアイコンを選んで、出力ファイルのアイコンの上にドラッグ&ドロップし、アイコン間の関係線をつなぎます。
5.関係線の設定2〔入力項目と出力項目をマッピング〕
下図のように、入力項目と出力項目を 1 対 1 で関係線を結び、
出力項目の出力フォーマットを 赤枠内 のように編集
- 形式 = 日付
- フォーマット = 西暦4桁月日時分秒 を出力するフォーマットを指定
6.データ加工処理
すべての設定が終わったので、 最後にIDを登録して、現在表示されている内容で、データ加工を実行します。
日付の入力フォーマットの登録が無い時
日付の入力フォーマット=登録無し の場合、以下のエラーになりました。
エラーになった "1999" は1項目目のデータなので、設定は2バイトのバイナリ。
2バイトのバイナリは5桁(-32,768 ~ +32,767)の範囲を表現するから、入力データが5桁の数字扱いになり、変換エラーになったようです。
次に、1項目目を出力フォーマットを標準に戻して、再度データ加工を実行すると、以下のエラーになりました。
エラーになった "199902" は2項目目のデータなので、設定は4バイトのバイナリ。
4バイトのバイナリは10桁(-2,147,483,648 ~ +2,147,483,647)の範囲を表現するから、入力データが10桁の数字扱いになり、変換エラーになったのかも。
2項目目を出力フォーマットを標準に戻して、再度データ加工を実行すると、次は正常終了 ![]()
私としては、3項目目も「入力データ(0019990214)は日付型に変更できない文字列です。」ってエラーになると踏んでいたのですが
想定外です。
ちなみに、この時の出力結果が ![]()
西暦4桁月2桁日2桁の値が入った項目のみ日付型へ変換して出力するなら、日付の入力フォーマットは登録無しでも OK みたいですね。
なお、4項目目以降は動作保証しない 9桁以上の数字 になるので、この検証はココで終わりです。
日付の入力フォーマットの登録が有る時
次は下図のように、オプション の 日付の入力フォーマットを登録します。
項目のバイト数によって有効桁数がきまっているので、必要な数の "0" を左に付けます。
再度データ加工処理を実行した出力結果は
こちら
- 項目 YYYY:
-
"1999/01/08 00:00:00"
5 桁の数値なので、入力フォーマットは 0YYYY
西暦4桁の値は入力データの値、月日は検証実施日(01/08)
時間部分はデータが無いので 0 が入り、結果は仕様通り - 項目 YYYYMM:
-
"1999/02/08 00:00:00"
10 桁の数値なので、入力フォーマットは 0000YYYYMM
西暦4桁と月の値は入力データの値、日は検証実施日(08)
時間部分はデータが無いので 0 が入り、結果は仕様通り - 項目 YYYYMMDD:
-
"1999/02/14 00:00:00"
10 桁の数値なので、入力フォーマットは 00YYYYMMDD
西暦4桁と月日の値は入力データの値
時間部分はデータが無いので 0 が入り、結果は仕様通り - 項目 YYYYMMDDHH:
-
"1999/02/14 18:00:00"
10 桁の数値なので、入力フォーマットは YYYYMMDDHH
西暦4桁と月日の値は入力データの値
時刻は 18 。分秒部分はデータが無いので 0 が入り、結果は仕様通り - 項目 YYYYMMDDHHMI:
-
"1999/02/14 18:15:00"
19 桁の数値なので、入力フォーマットは 0000000YYYYMMDDHHMI
西暦4桁と月日の値は入力データの値
時刻は 18 、分は 15 。秒部分はデータが無いので 0 が入り、結果は仕様通り - 項目 YYYYMMDDHHMISS:
-
"1999/02/14 18:15:45"
19 桁の数値なので、入力フォーマットは 00000YYYYMMDDHHMISS
西暦4桁と月日の値は入力データの値
時刻は 18 、分は 15 、秒は 45 が入り、結果は仕様通り
入力フォーマットが出力フォーマットの該当部分に収まって出力されました。
以上です












