在一个数据映射过程中处理多个输入文件

典型的数据转换任务需要处理大量分批到达的输入文件。 Altova MapForce 提供了功能,让您可以在最小程度的干预下处理一组文件。 例如,我们最近从一款带有 GPS 功能的数码相机存储卡上复制了一组文件。 每个 .LOG 文件都是一个 CSV 文件,其中包含一条特定路线的 GPS 坐标。

我们迅速设计了一个转换方案,将 CSV 数据转换为基于 XML 格式的 .gpx 文件,并对所有三个文件进行了处理,从而在一次运行中生成了三个输出文件

首先,我们在映射工具的“属性”对话框中,针对输入组件,使用了通配符来指定输入文件名。这指示 MapForce 软件分别处理工作目录中所有与该通配符匹配的文件。

如果您正在设计一个复杂的转换过程,或者输入文件非常大,您可以先使用一个唯一的文件名来创建映射关系,然后在您对映射结果满意后,再切换到使用通配符。

文件路径函数

内置的 MapForce 函数库包含文件路径函数,我们可以使用这些函数来管理输出文件名。如果我们定义一个输出文件,那么在处理每个新的输入数据时,新的数据将会追加到该文件中。

您可以将文件路径函数与其他字符串函数结合使用,从而完全控制输出文件的名称和位置。我们决定将输出文件保存在与输入文件相同的目录下,但为了创建更具描述性的文件名,并使用“.gpx”文件扩展名。

以下代码片段展示了如何使用字符串拼接函数以及文件路径函数,将文件 "1211190.LOG" 等文件转换为输出文件 "1211190converted.gpx",以此类推。

您还可以使用文件路径函数来生成字符串,并将这些字符串作为输出。用于 .gpx 文件的 XML 模式包含一个元数据描述元素。我们决定将输入文件名插入到元数据中,以便明确地将输出文件与原始数据关联起来。这种方法使得输出文件具有自我描述性,并且在需要追溯意外输出时,可以帮助您找到原始数据源,从而方便调试。

以下代码片段展示了如何将源文件名插入到字符串中,并将该字符串映射到元数据 <desc> 元素:

结果描述显示在“地图输出预览”的第4行

(图片预览:显示带有文件名的数据输出。)

过滤输入数据

这个数据映射的核心需要对输入文件进行过滤。摄像机的GPS日志文件是按照美国国家海洋电子协会(NMEA)的规范记录的。下面展示了其中一个输入文件的一部分:

在第一行之后,每个记录点都由两个NMEA语句描述,其中语句类型在第一个字段中标识。每个GGA语句包含时间、纬度、经度、海拔高度以及关于定位质量的附加数据。每个RMC语句包含时间、纬度、经度和日期。

一个RMC语句包含了生成.gpx文件所需的最小数据 <trkpt> 元素,因此我们可以使用过滤器来选择输入中的特定行,就像这里展示的:

如果某行数据的第一栏中的消息类型包含“$GPRMC”,则该行数据会被传递给后续处理模块。如果不是,则该行数据将被忽略。

输入文件中的实际数据也需要进行一些处理。对于每一个纬度和经度,我们需要将源文件中定义角度、分钟和秒的多个字段组合起来,并转换为十进制角度。我们还需要将时间和日期字段组合在一起,并将结果按照.gpx格式要求的ISO 8601格式记录下来,例如2012-11-19T20:43:23Z。为了封装这些转换的复杂性,并将它们与主程序分离,我们将每一种转换定义为用户函数。

这个地图也提供了一个机会,可以重用我们在之前的文章中定义的 getElevationUS 用户函数 应对意想不到的情况——Altova MissionKit 解决了格式转换难题. 这次,我们将海拔数据四舍五入到小数点后三位,以表示最接近的毫米。

CamerlogToGPX 数据映射的核心部分,以及其中包含的用户函数,大致如下所示:

以下是一个输出文件示例,其中包含一个 <trk> 元素、一个 <trkseg> 元素以及多个 <trkpt> 元素。

“MapForce 输出”菜单提供了一组选项,允许我们验证输出文件是否符合 .gpx XML 模式

如果您希望使用 Altova MapForce 用于批量处理输入文件,以便您进行自定义的数据映射 点击此处下载免费试用版.