---
title: "データ変換の検証とデバッグ"
date: "2022-11-30"
categories: 
  - "data-integration"
  - "tools"
tags: 
  - "data-integration"
  - "data-mapping"
  - "data-mapping-debugger"
  - "data-mapping-validation"
  - "mapforce"
description: MapForceを使ったデータ変換の検証とデバッグ方法について解説します。この記事では、データマッピングとデータ統合における正確性を確保するためのテクニックを紹介します。
---
Status: #blog

Tags:  #data-integration #data-mapping #data-mapping-debugger #data-mapping-validation #mapforce

Categories: [data-integration](/blog/ja/category/data-integration.md) | [etl](/blog/ja/category/etl.md)
# データ変換の検証とデバッグ

ソフトウェア開発者やその他のデータ専門家は、データをある形式から別の形式に変換する必要があることがよくあります。これらの変換は、単純な1対1の変換である場合もあれば、より複雑な操作を必要とする場合もあります。例えば、CSV形式のファイルをデータベースにインポートする際には、データの関連性を生成する必要がある場合があります。また、ソースデータをターゲットに合わせて分割する必要がある場合もあります。例えば、氏名全体を、名、中間名、姓、およびオプションの接尾辞に分割するなどが考えられます。データの変換を検証することは、データ損失や破損を防ぐために非常に重要です。

以前の記事で、[Webサービスデータ統合](https://www.altova.com/blog/web-service-data-integration/)について、GMT時刻の文字列値と秒単位の数値を組み合わせて、天気予報の地域時間を作成しました。この処理に必要なすべてのステップを実行するユーザー関数を作成しました。MapForceには、この変換を簡単に追跡および検証できる、強力なインタラクティブなデータマッピングデバッガーが搭載されています。その仕組みを見ていきましょう。

![コンピューターに向かって作業しているソフトウェア開発者](/blog/images/Mapforce_debug_blog_1.jpg)

<!--more-->

弊社のデータ変換プロジェクトにおける、ユーザー関数「calc-local-time」の動作イメージです。ご覧のとおり、MapForceは、視覚的なインターフェースとドラッグ＆ドロップ操作により、コーディングを必要としないデータマッピングをサポートしています。

[![データ変換プロジェクトにおける、ローカル時間を計算するためのユーザー定義関数](/blog/images/data-mapping-1-2.png)](data-mapping-1-2.png)

この関数は、日付と時刻を表す文字列 (形式: 2020-02-22 18:00:00) である `dt_txt` と、予測対象の場所におけるタイムゾーンのオフセット（秒単位の数値）を受け取ります。

データが変換されると、その関数の出力結果はExcelのスプレッドシートのA列に反映されます。スプレッドシート内では、A列の形式が「日付」として定義されており、その形式には時刻も含まれます。例えば、「2020年5月20日 午後4時」のように表示されます。

ユーザー関数ヘッダーをダブルクリックすると、その関数が展開され、個々の処理内容が表示されます

[![ユーザーがローカルタイムを計算するために使用する機能に含まれる処理内容は以下の通りです](/blog/images/calc-local-time-1.png)](calc-local-time-1.png)

右側に2つの入力値があり、左端には最終的な出力値「A」が表示されています。簡単に説明すると、この関数は、タイムゾーンの秒数を、入力された日付と時刻（dt_txt）に加算して、現地時間（ローカルタイム）を計算します。MapForceには、この処理を行う組み込みの「datetime-add」関数があり、上記の画像では、出力値「A」のすぐ左側にその関数が示されています。しかし、実際には単純に見えても、そう簡単ではありません！ウェブサービスから受け取る入力値は、さまざまな形式で提供されるため、それらを「datetime-add」関数の形式と構文に合わせて調整する必要があります。

### MapForce デバッガーを使用したデータ変換の検証

MapForce を利用することができます [データ変換デバッガー](https://www.altova.com/ja/mapforce#data_mapping_debugger) ユーザーが作成した関数が、期待される結果を正しく返すかどうかを確認するために、その関数の動作を追跡します。まず、タイムゾーン入力欄を右クリックして、デバッグブレークポイントを設定します

[![データ変換の検証を、デバッガーのブレークポイントを使用して行う](/blog/images/debug-1.png)](debug-1.png)

いくつかのデバッグ支援ウィンドウが開かれ、プログラムはブレークポイントに到達するまで実行を継続します。ブレークポイントで処理された値が強調表示されます

[![データ変換のデバッグ中に、ブレークポイントで処理が一時停止します](/blog/images/debug-2.png)](debug-2.png)

実行を継続するためのいくつかのオプションが用意されています。最も詳細な情報を提供するオプションは「最小ステップ」で、各データ変換処理を細かく確認できます。

[![MapForceのツールバーにあるデバッガーのステップ実行オプション](/blog/images/debug-3.png)](debug-3.png)

このコマンドは、処理ステップを細かく分割し、通常、各接続に対して2回停止します。1回は、そのソースが値を生成するときに、もう1回は、そのターゲットがその値を受け取る際に停止します。「Minimal Step」を繰り返しクリックすると、変換処理が継続され、`calc-local-time`関数がどのように処理を進めているのかを詳細に確認することができます

[![ユーザーが定義した関数の実行手順について](/blog/images/debug-4.png)](debug-4.png)

プログラムの実行が進むにつれて、各接続ポイントの値がウィンドウに追加されていきます。

組み込みの `datetime-add` 関数は、最初の入力として日付と時刻の値を、そして2番目の入力として、加算する期間を指定する文字列値を必要とします。以下の図では、出力値が生成されるまでの過程を段階的に示しています。図の中で、`datetime-add` 関数への入力値と、最終的に生成された結果が強調表示されています

[![機能の結果を確認するために、さらに操作を続けてください](/blog/images/debug-5.png)](debug-5.png)

元の秒のオフセット値は28,800秒で、これは8時間です。計算結果は、参照時間であるdt_txtから8時間遅れているため、出力結果は正しいです。

### 他の事例についても検討する

GMT（グリニッジ標準時）からのずれは、GMTよりも東にある地域ではプラスの値になり、西にある地域ではマイナスの値になります。つまり、ニューヨークはロンドンよりも西に位置するため、現地時間はより早くなります。一方、北京はGMTよりも東に位置するため、現地時間はより遅くなります。

`calc-local-time`関数について、タイムゾーンのオフセットが負の値の場合を検証する必要があります。

その方法にはいくつかの選択肢があります。現在、入力リストにある都市には、協定世界時（GMT）より東にある場所と、西にある場所の両方が含まれています。したがって、タイムゾーンが負の値になる場所が見つかるまで、処理を段階的に進めていくことができます。

[![「Ebサービスデータのマッピングに使用する、都市リストが入力されたファイル」の表示](/blog/images/port-list-grid-1.png)](port-list-grid-1.png)

このWebサービスは、各都市に対して40件の予測データを返しますが、最初の4つの都市すべてについて確認するのは大変です。

都市リストを修正して、西半球の都市をリストの先頭に追加することもできますし、テストケース用の新しい入力ファイルを作成することもできます。多くの場合、それが妥当なテスト戦略です。

あるいは、ブレークポイントの条件を設定することもできます。もし、値が負の数になった場合にのみプログラムを一時停止するようにブレークポイントを設定できれば、元の入力ファイルを使って処理を続けることができます。それが、最終的な結論に最も早く到達する方法です。

データマッピングに戻り、ブレークポイントを右クリックして、そのプロパティを編集します

[![ブレークポイントのプロパティの変更](/blog/images/breakpoint-props-1.png)](breakpoint-props-1.png)

これにより、ブレークポイントを条件付きにするための設定を行うダイアログが開きます。以下に示す画像は、タイムゾーンの値が負の場合にプログラムの実行を停止させる条件の設定例です

[![データ変換の検証のためのブレークポイント設定ダイアログ](/blog/images/breakpoint-props-2.png)](breakpoint-props-2.png)

これで、マッピング処理をデバッグモードで再実行できます。入力リストの最初の数都市（すべてGMTより東にある都市）が処理されます。最初の負のタイムゾーン値が見つかると、ブレークポイントが作動し、処理が一時停止します。

[![ブレークポイントの条件が満たされ、プログラムの実行が一時停止します](/blog/images/debug-6.png)](debug-6.png)

上記のステップ追跡の手法と同様に、`calc-local-time`関数が処理を進める中で、負の値がどのように変化するかを追跡することができます。

[![負の入力値に対するデータ変換の実行過程を追跡することで、その妥当性を検証します](/blog/images/debug-7.png)](debug-7.png)

タイムゾーンの値（-25,200秒）は文字列に変換されます。その後、組み込みの連結関数が文字列の先頭と末尾に文字を追加し、`datetime-add`関数で使用する期間を表す文字列を構築します。

負の値を加えることは、引き算と同じですが、この時点では期間の記述形式が正確ではありません。マイナス記号（ハイフン）は、期間の文字列の最初の文字でなければなりません。そのため、replace関数は文字列内で"PT-"を検索し、見つかった場合は"-PT"に置き換えます。

25,200秒は7時間です。入力値である2020年5月23日午前0時0分0秒から7時間を差し引くと、2020年5月22日午後5時0分0秒、つまり2020年5月33日の午後5時0分0秒になります。これで、正のオフセットと負のオフセットの両方のケースで、ユーザー関数が正常に動作することを確認しました。

データ変換の正確性を検証する場合でも、予期せぬ結果の原因を特定する場合でも、 [デバッグのためのデータ変換処理](https://www.altova.com/ja/mapforce#data_mapping_debugger) そして、MapForceの変換機能は、データ統合やETLプロジェクトの内部構造について、これまで考えられなかったほど詳細な情報を提供し、高価なデータマッピング製品でも実現できなかったレベルの洞察を提供します。

短い動画をご覧ください [ビデオデモ](https://www.altova.com/ja/mapforce/demos) MapForceの、または [無料トライアル版をダウンロードする](https://www.altova.com/ja/mapforce/download) JSONやWebサービスデータの統合、またはその他のデータのマッピング、変換、加工など、独自のプロジェクトを始めるためのチュートリアル、ヘルプ、そして豊富なサンプルをご用意しています。
