---
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/zh/category/data-integration.md) | [etl](/blog/zh/category/etl.md)
# 验证和调试数据转换

软件开发人员和其他数据专业人士经常需要将数据从一种格式转换为另一种格式。这些转换可能很简单，例如一对一的转换，也可能需要更复杂的处理。例如，在将扁平的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)

该函数接受两个参数：`dt_txt`，它是一个字符串，表示日期和时间，格式为 "2020-02-22 18:00:00"；以及一个数值，表示预测地点的时区与格林威治标准时间（GMT）的偏移量，单位为秒。

一旦数据被转换，该函数的输出结果会被映射到 Excel 表格的 A 列。在表格中，A 列的格式被定义为“日期”，并且该格式包含时间，例如：5/20/20 4:00 PM。

双击用户函数标题，可以展开它，显示其中的各个操作

[![用户函数中包含的运算，用于计算本地时间](/blog/images/calc-local-time-1.png)](calc-local-time-1.png)

两个输入值位于右侧，而最终输出值，标记为“A”，位于最左侧。简单来说，这个函数会将时区中的秒数加到“dt_txt”日期和时间上，从而计算出本地时间。MapForce内置了一个日期时间加法函数，可以执行此操作，如图所示，该函数位于输出值A的左侧。但事情远比看起来复杂！从Web服务接收到的输入值可能采用不同的格式，因此必须调整为日期时间加法函数所需的格式和语法。

### 使用 MapForce 调试器验证数据转换

我们可以使用 MapForce [数据转换调试器](https://www.altova.com/zh/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)

此命令会将一个步骤细分，并且通常会为每个连接暂停两次：一次是在源产生值时，另一次是在目标消耗该值时。反复点击“最小步长”可以继续执行转换，并让我们精确地观察到 `calc-local-time` 函数在处理过程中的具体情况

[![执行用户自定义函数的步骤](/blog/images/debug-4.png)](debug-4.png)

在执行过程中，每个连接点的值都会被添加到窗口中。

内置的 `datetime-add` 函数需要一个日期时间值作为第一个输入，以及一个字符串值，用于指定要添加的时间段作为第二个输入。在下面的示例中，我们逐步展示了整个过程，直到最终生成输出值。以下高亮显示了 `datetime-add` 函数的输入以及最终生成的输出结果：

[![持续点击以查看功能结果](/blog/images/debug-5.png)](debug-5.png)

原始的秒数偏移值为28,800秒，相当于八个小时。计算结果比参考时间dt_txt晚了八个小时，因此输出结果是有效的。

### 考虑其他情况

与格林威治标准时间（GMT）的时差，只有位于格林威治以东的地区才会是正值。位于格林威治以西的地区，时差应为负值。换句话说，纽约位于伦敦的西边，因此当地时间比伦敦早。北京位于格林威治的东边，因此当地时间比格林威治晚。

我们需要验证 `calc-local-time` 函数在时区偏移量为负数的情况下的正确性。

我们有几种方法可以实现这一点。我们的输入列表包含了位于格林威治标准时间（GMT）以东和以西的多个地点。我们可以持续执行程序，直到遇到一个时区值为负值的地点。

[![城市列表输入文件，用于Eb服务数据的映射](/blog/images/port-list-grid-1.png)](port-list-grid-1.png)

该Web服务为每个城市返回40个预测结果，因此逐一查看前四个城市的所有预测结果会非常繁琐。

我们可以修改城市列表，将一个来自西半球的新城市添加到列表的顶部，或者我们可以为测试用例创建一个新的输入文件。在很多情况下，这是一种合理的测试策略。

或者，我们可以设置一个断点条件。如果我们可以设置断点，使其仅在遇到负值时暂停，那么我们就可以继续使用原始输入文件。这将是得出最终结论的最快方法。

回到数据映射界面，我们右键单击断点，以修改其属性：

[![修改断点属性](/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` 函数的持续时间字符串。

添加一个负值等同于减法，但目前时长参数的语法还不够完善。减号（连字符）需要是时长字符串的第一个字符。因此，替换函数会在字符串中查找 "PT-"，如果找到，则将其替换为 "-PT"。

25,200秒等于七个小时。从输入值2020-05-23T00:00:00中减去七个小时，结果是2020-05-22T17:00:00，即2020年5月22日下午5点。现在，我们已经验证了该用户函数，它能够处理正向和负向时间偏移的情况。

无论您是在验证数据转换的准确性，还是在追踪意外结果，MapForce提供的[数据转换调试](https://www.altova.com/zh/mapforce#data_mapping_debugger)功能，都能深入了解数据集成和ETL项目的具体运作方式，这种程度的洞察力是以前即使在价格更高的其他数据映射产品中也无法实现的。

观看一份简短的[视频演示](https://www.altova.com/zh/mapforce/demos)，了解 MapForce 的功能，或者[下载免费试用版](https://www.altova.com/zh/mapforce/download)，其中包含教程、帮助文档以及更多示例，帮助您快速开始使用 MapForce，用于 JSON 和 Web 服务数据的集成，或者其他数据映射、转换和处理需求！
