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】ちょっとブレイク!"エラーデータのスキップ" ってイイじゃん

0
Last updated at Posted at 2026-02-27

はじめに

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

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

今回の課題

DataMagic の紹介をしていると、よく聞かれる質問の一つに、

 コレ、エラーレコードの読み飛ばしってできるの :interrobang:

分かりますよ、その質問。よ~く分かりますよ。

あとチョットで処理が完了するって時に、不正なレコードに引っかかって 異常終了 :scream:
今までの処理時間返せ~~~ :sob:

私も何度か当たり散らしたしたことがあります。

DataMagic には、不正なレコードだけ除外して処理を継続させる エラーデータスキップ機能 があります。

勿論、すべての状況で不正レコードをスキップする訳ではありませんが、この機能を使うことで、エラー発生原因となった該当レコードをスキップして処理を継続させることができます。

エラーデータスキップ

エラーデータスキップ機能は、データ加工実行コマンド(utled コマンド) を実行した場合に使用できます。

1.パラメータ

エラーデータスキップに関係するパラメータは以下になります。

-errdatfile filename

不正なレコードを検出した際に、該当レコードを出力するファイル名(省略可)

指定するとエラーデータスキップ機能が有効化され、エラーデータが指定ファイルに出力されます。
絶対パスまたは相対パスで指定します。
1~200バイトの文字(Windows)、英数字および記号(UNIX/Linux)で指定します。

-errcausefile filename

不正なレコードを検出した際に、エラースキップの原因を出力するファイル名(省略可)

指定するとエラーデータスキップ機能が有効化され、エラースキップの原因が指定ファイルに出力されます。
絶対パスまたは相対パスで指定します。
1 ~ 200 バイトの文字(Windows)、英数字および記号(UNIX/Linux)で指定します。

-errcausekeys numbers

エラー原因ファイルに出力するキー項目の入力項目番号(省略可)

入力項目番号は最大10個まで指定可能です。
複数指定する場合は、カンマ区切りで指定します。
入力項目番号を複数指定した場合、指定した順序でエラー原因ファイルに出力します。

-errovrwr

エラーデータファイル(-errdatfile で指定したファイル)、エラー原因ファイル(-errcausefile で指定したファイル)が存在する際に、上書き(省略可)

-errdatfile、または -errcausefile 指定時に指定できます。
省略時は、既にファイルが存在するとエラーで終了します。

-errdatmax max

エラーデータスキップを許容する最大レコード数(省略可)

-errdatfile、または -errcausefile 指定時に指定できます。
エラーレコード数がこの値を超えた時点で処理を中断します。
1 ~ 999,999,999 までの値を指定します。未指定時は無制限とみなして動作します。

2.エラーデータスキップ

今回は、テスト実行 の設定&データを流用して「データ加工ID=ErrorSkip」を作成。
上記のパラメータを組合わせて、エラーデータスキップを試してみます。

入力データ と 抽出条件
  • 入力データは、コレ :arrow_down: で、赤点線枠の中がエラーになる値(みかん & ネーブル)
    2バイト文字を含むので数値演算でエラー
  • 抽出条件は、産地名が無い(空文字)のもの

Qiita_031-01.jpg

:zero: スキップ用のパラメータ無し

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r
変換エラー (ERRCODE=053-038)
入力データ(327)を数字文字列型に変換できませんでした。

この場合、出力ファイルには、エラーレコードの直前のレコードまで出力
Qiita_031-02.jpg

:one: -errdatfile filename

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errdatfile C:\@data\DataMagic\error_skip\errdatfile.txt
エラーデータスキップ発生 (ERRCODE=125-001)
最後まで処理を実施しました。

この場合、出力ファイルには、エラーレコード以外の全対象レコードを出力
Qiita_031-03.jpg

指定したエラーデータファイルの中は、スキップしたレコードを出力
Qiita_031-04.jpg

:two: -errcausefile filename

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errcausefile C:\@data\DataMagic\error_skip\errcausefile.txt
エラーデータスキップ発生 (ERRCODE=125-001)
最後まで処理を実施しました。

この場合、出力ファイルの内容は :one: と同じ

指定したエラー原因ファイルの中には、スキップした理由を出力
Qiita_031-05.jpg

エラー原因ファイルのフォーマットは、操作マニュアルの ココ :books: で公開してます。

ちなみに、この出力内容は「テスト実行」のテスト結果ファイルのと同じでした。

:three: -errcausekeys numbers

今回はキー項目として、5項目目の "品目名" と、6項目目の "品目コード" を指定してみました。

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errcausekeys 5,6 -errcausefile C:\@data\DataMagic\error_skip\errcausefile.txt
エラーデータスキップ発生 (ERRCODE=125-001)
最後まで処理を実施しました。

指定したエラー原因ファイルの中は、:two: の出力内容+指定したキー項目の値を出力

Qiita_031-08.jpg

:four: -errovrwr

エラーデータファイル(-errdatfile で指定したファイル)が存在する状態で、指定なし
C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errdatfile C:\@data\DataMagic\error_skip\errdatfile.txt
出力ファイルオープンエラー (ERRCODE=052-007)
エラーデータファイル(C:\@data\DataMagic\error_skip\errdatfile.txt)のオープンに失敗しました。理由(ファイルがあります。)

エラーデータファイルが存在する状態で、指定あり

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errovrwr -errdatfile C:\@data\DataMagic\error_skip\errdatfile.txt
エラーデータスキップ発生 (ERRCODE=125-001)
最後まで処理を実施しました。

:five: -errdatmax max

今回のエラーレコードは 2 件なので、1 を指定(エラーデータファイルの出力を指定)

C:\HULFT Family\huledpro>utled.exe -i ErrorSkip -r -errdatmax 1 -errdatfile C:\@data\DataMagic\error_skip\errdatfile.txt
エラーデータスキップ発生 (ERRCODE=125-002)
エラースキップ件数が最大件数を超えました。

この場合、出力ファイルには、エラーレコードの最初のエラー項目まで出力

Qiita_031-06.jpg

指定したエラーデータファイルの中は、最大件数(1件)までスキップしたレコードを出力

Qiita_031-07.jpg

付随情報

今回紹介したパラメータの内、

-errcausekeys numbers
   :エラー原因ファイルに出力するキー項目の入力項目番号(省略可)

って、エラー解決にどう役立つのか、正直ピンとこなかったのですが、
この キー項目 ってヤツ、結構役に立つらしい。

例えば、本編の入力データがフォーマット形式で、同様の処理を行うと、エラー原因ファイルには以下の内容が出力されます。

Qiita_031-10.jpg

仮に、入力データのレコードが、改行コードで区切られていない場合。

:b: のような、表示内で折り返すだけのものや、想定外のところで折り返しているように見えるエディタで、入力データを表示すると

  • レコードの区切りを探すのが難しい
  • 入力レコード数が分かっても、対象のレコードが探しづらい

:a: のエディタのように、指定した桁数で折り返して、入力データが表示できれば、
エラー原因ファイルに出力された「入力レコード数(10)」や「入力レコード数(14)」の情報から、対象のレコードが直ぐに見つけられますが、

  • エラーが発生した入力レコード数が大きかった場合、対象のレコードが探しづらい

Qiita_031-09.jpg

そんな時、ユニークキーをキー項目として指定しておくと、エラーレコードのユニークキーがエラー原因ファイルに出力されるので、そのユニークキーを使って検索することで、エラーレコードが見つけ易くなります。

また、入力データが他の処理で加工されたものだった場合、
元ネタファイルのエラーレコードがエラー原因ファイルに出力された 入力レコード数 とは異なる場合が往々にしてあります。
そんな場合も、ユニークキーをキー項目として指定しておくと、出力されたユニークキーを使って元ネタファイルを検索することで、元ネタファイルの中のエラーレコードが見つけ易くなります。

この説明でイメージできたア・ナ・タ。 キー項目って結構使えるでしょ :100:

補足

エラーデータスキップの機能を使用する場合は、以下のマニュアルの記載で、必ず制限などを確認してください。

以上です。

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?