0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DataMagic】データ加工やってみた!日付タイプ以外の日付データを加工[Pタイプ編]

0
Last updated at Posted at 2026-01-16

はじめに

DataMagic は、色々な機能を備えています。

機能・概要一覧
機能  概要
マッチング 入力ファイルのレコードと、共通する項目名をキーにした複数のマッチングファイルのレコードを結合し、一つのデータセットとして出力する
マージ 入力ファイルとマージファイルを連結して、入力マージデータとして取り扱えます。入力マージデータに対しては、データ加工前に重複行の削除やソートする
出力先振り分け 抽出条件に沿って、出力ファイルを振り分ける
数値項目演算 出力項目が数値タイプの場合、入力項目同士や任意の値との演算式を指定し、その演算結果を出力項目の値として出力する
データ抽出 入力データから、指定した条件に合致したデータのみを抽出する
項目入替 入力データの項目を入れ替えて、別のフォーマットで出力する
項目結合 複数の項目を結合して、1つの項目として出力する
項目分割 単一項目を分割して、複数の項目として出力する
全角半角 「カナ」「英数字」および「記号」を、半角から全角、全角から半角へ変換する
出力フォーマット指定 日付型、数字文字列型の入力項目を出力する際に、フォーマットを指定する
入力ソート 入力ファイルの形式がCSV、フォーマット、Excelの場合は、データ加工の前にソートする
属性変換 入力データを出力データに変換する際に、数値タイプを任意の数値タイプへ変換する
日付項目演算 日付データに対して、演算や西暦⇔和暦の変換を指定し、その結果を出力項目の値として出力する
関数 入力項目の値を関数で処理し、その処理結果を出力項目の値として出力する
マッピング 入力ファイルから出力ファイルへのデータの流れや加工、変換ルールを定義し、異なるデータ形式間での項目の対応関係を設定する
動的指定 データ加工の実行時にコマンドの引数に指定した数値や文字列を、条件や出力情報に使用できる
ユーザ出口変換 データを加工するときに、項目単位で独自の変換を設定するために、ユーザ出口プログラムを独自に作成できる
データ挿入 レコード内の任意の項目にユーザ指定の任意の値を挿入できる
仕様書出力 データ加工の処理と設定内容を仕様書としてExcelファイルに出力できる
チュートリアル データ加工の設定を対話的に実行して、DataMagicの基本的な操作方法を習得できる
カスタムエラー カスタムエラー条件を使用すると、データの形式は問題ないが、意図しないデータ(例 別の事業所のデータ)を検出したときにデータ加工をエラーにできる
ステップ実行 プログラムのデバッガの処理のように、経過を確認しながら実行し、意図するように変換できなかった場合の解析、またはデータ加工の処理経過の確認に使用できます。
コード変換 1バイトコード間、または2バイトコード間で、文字コードを変換する

今回の課題

以下の記事 :arrow_down::arrow_down: では、フォーマット形式の日付タイプと「日付の入力フォーマット」の関係について確認してみました。

がぁ、そもそも〝日付データ = 日付タイプ〟 とは限らない訳で。

日時のデータでも、数値や文字列として格納していることも。

特に、Mainframeで扱うファイルは、いかにレコード長を押さえて多くの情報を格納するかを考えるので、数字で表現できる情報はパック10進数(Pタイプ)にすることも少なくない。

実は、ある 有力筋 からも以下の情報が

DataMagicの「日付の入力フォーマット」機能は、ファイル形式や日付タイプか否かに関係なく、以下の処理で参照する入力データには全て適用されます。

  • 日付演算
  • 出力フォーマットに日付を選択

と言うことで、今回はこの情報 :arrow_up: の裏どりをやってみます。

〝ファイル形式や日付タイプか否かに関係なく〟と言っても、【DataMagic】データ加工やってみた!日付の入力フォーマット ってなんだろう のエラー画像を見ると『日付文字列に変換できませんでした。』のメッセージが表示されているので、そもそも〝日付文字列に変換できる〟ことが前提 :thinking:

ってことは、日付文字列 :fast_forward: 日付データに変えられる項目タイプは、以下の黄色のラインに :o: が付いている項目(と思われる)。

Qiita_018-01.jpg

流石に全部試すのはご勘弁 :no_good_tone1: いただき、
今回は 日付タイプ以外 の〝Pタイプ〟で検証してみます。

入力データ

入力データは、1999年03月03日18時15分45秒 :dolls: を、以下のルールに従い作成してします。

  • 項目1:西暦4桁(1999)
  • 項目2:西暦4桁月2桁(199903)
  • 項目3:西暦4桁月2桁日2桁(19990303)
  • 項目4:西暦4桁月2桁日2桁時2桁(1999030318)
  • 項目5:西暦4桁月2桁日2桁時2桁分2桁(199903031815)
  • 項目6:西暦4桁月2桁日2桁時2桁分2桁秒2桁(19990303181545)
16進数入力データ
01 99 94 01 99 90 34 01 99 90 30 34 01 99 90 30 31 84 01 99 90 30 31 81 54 01 99 90 30 31 81 54 54

コピーした16進数入力データは、こんな感じ :arrow_heading_down: でバイナリエディタの16進数側(このエディタの場合は左側)にペーストしてください。

Qiita_022-01.jpg

バイナリエディタが無い場合は、以下の変換元データを DataMagic の属性変換機能を使って、全項目Pタイプのフォーマットファイルに変換してください。

変換元データ
199919990219990214199902141819990214181519990214181545

ちなみに、この時の出力側のレイアウトは、以下 :arrow_down: のレイアウト情報にあるフォーマット形式のレイアウトになります。

レイアウト情報

今回の入力データはフォーマット形式なので、省略はできません。
また、Pタイプ(パック10進数)は、各桁を4ビットで表現し、1の位の右側に符号領域の4ビットを加えて数値を表現しています。

従って、1項目目の "1999" を格納するためには、3バイト必要です。
 ( 4bit × 4桁 + 符号領域の4bit )/ 8bit = 2.5Byte = 3Byte

この点を考慮して、各項目のバイト数は以下の値で登録します。

Qiita_022-02.jpg

また、今回の出力形式も CSV ですが、出力結果が見易いように、以下の内容でレイアウトを登録しました(勿論省略でも問題なしです)。

Qiita_018-03.jpg

データ加工

1.入力ファイルエリアの編集

入力形式=フォーマット、漢字コード種=SHIFT-JIS

以下で説明する項目以外の設定は、初期値を採用します。

レイアウト

ID:
今回用に登録したフォーマットの ID を設定
ファイル名:
入力データをコピペして作った〝Pタイプ用〟データのファイルを指定

Qiita_018-04.jpg

2.出力ファイルエリアの編集

出力設定

出力形式=CSV、漢字コード種=SHIFT-JIS

以下で説明する項目以外の設定は、初期値を採用します。

レイアウト

ID:
今回用に登録したCSV の ID を設定
もしくは、省略
ファイル名:
出力ファイル名を指定

Qiita_018-05.jpg

3.抽出条件の設定

初期設定のまま使用

4.関係線の設定1〔抽出条件と出力ファイル〕

抽出条件のアイコンを選んで、出力ファイルのアイコンの上にドラッグ&ドロップし、アイコン間の関係線をつなぎます。

5.関係線の設定2〔入力項目と出力項目をマッピング〕

下図のように、入力項目と出力項目を 1 対 1 で関係線を結び、
出力項目の出力フォーマットを 赤枠内 のように編集

  • 形式 = 日付
  • フォーマット = 西暦4桁月日時分秒 を出力するフォーマットを指定

Qiita_018-06.jpg

6.データ加工処理

すべての設定が終わったので、 最後にIDを登録して、現在表示されている内容で、データ加工を実行します。

結果を見る前に

【公式】DataMagic 操作マニュアル に以下の記載があります。
この仕様を踏まえて。
なお、当該検証は 2026年1月15日 に実施 しています。

Qiita_018-08.jpg

日付の入力フォーマットの登録が無い時 :worried:

日付の入力フォーマット=登録無し の場合、以下のエラーになりました。

Qiita_022-03.jpg

エラーになった "1999" は1項目目のデータなので、設定は3バイトで5桁以内の数値。

次に、1項目目を出力フォーマットを標準に戻して、再度データ加工を実行すると、以下のエラーになりました。

Qiita_022-04.jpg

エラーになった "199903" は2項目目のデータなので、設定は4バイトで7桁以内の数値。

更に、2項目目を出力フォーマットを標準に戻して、再度データ加工を実行すると、次は正常終了 :scream:

私としては、3項目目も「入力データ(0019990303)は日付型に変更できない文字列です。」ってエラーになると踏んでいたのですが :thinking: 想定外です。

ちなみに、この時の出力結果が :arrow_down:

Qiita_022-07.jpg

西暦4桁月2桁日2桁の値が入った項目のみ日付型へ変換して出力するなら、日付の入力フォーマットは登録無しでも OK みたいですね。

なお、4項目目以降は動作保証しない 9桁以上の数字 になるので、この検証はココで終わりです。

日付の入力フォーマットの登録が有る時 :grin:

次は下図のように、オプション の 日付の入力フォーマットを登録します。
色々試してみて、Pタイプの場合は下図のように "0" を左に付けます。

Qiita_022-05.jpg

再度データ加工処理を実行した出力結果は :arrow_down: こちら

Qiita_022-06.jpg

項目 YYYY:
"1999/01/15 00:00:00" 
 入力フォーマットは 000000YYYY
 西暦4桁の値は入力データの値、月日は検証実施日(01/15)
 時間部分はデータが無いので 0 が入り、結果は仕様通り
項目 YYYYMM:
"1999/03/15 00:00:00" 
 入力フォーマットは 0000YYYYMM  
 西暦4桁と月の値は入力データの値、日は検証実施日(15)
 時間部分はデータが無いので 0 が入り、結果は仕様通り
項目 YYYYMMDD:
"1999/03/03 00:00:00" 
 入力フォーマットは 00YYYYMMDD  
 西暦4桁と月日の値は入力データの値
 時間部分はデータが無いので 0 が入り、結果は仕様通り
項目 YYYYMMDDHH:
"1999/03/03 18:00:00" 
 入力フォーマットは 000000000YYYYMMDDHH  
 西暦4桁と月日の値は入力データの値
 時刻は 18 。分秒部分はデータが無いので 0 が入り、結果は仕様通り
項目 YYYYMMDDHHMI:
"1999/03/03 18:15:00" 
 入力フォーマットは 0000000YYYYMMDDHHMI  
 西暦4桁と月日の値は入力データの値
 時刻は 18 、分は 15 。秒部分はデータが無いので 0 が入り、結果は仕様通り
項目 YYYYMMDDHHMISS:
"1999/03/03 18:15:45" 
 入力フォーマットは 00000YYYYMMDDHHMISS  
 西暦4桁と月日の値は入力データの値
 時刻は 18 、分は 15 、秒は 45 が入り、結果は仕様通り

入力フォーマットが出力フォーマットの該当部分に収まって出力されました。

以上です

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?