---
title: "在一个数据映射过程中处理多个输入文件"
date: "2013-01-29"
categories: 
  - "applications"
  - "data-integration"
tags: 
  - "data-mapping"
  - "mapforce"
description: 了解如何使用 Altova MapForce 高效地处理多个输入文件，进行数据映射。本指南涵盖通配符、文件路径函数以及过滤技术。
---
Status: #blog

Tags:  #data-mapping #mapforce

Categories: [ETL](/blog/zh/category/etl.md) | [data-integration](/blog/zh/category/data-integration.md)
# 在一个数据映射过程中处理多个输入文件

典型的数据转换任务需要处理大量分批到达的输入文件。 [Altova MapForce](https://www.altova.com/zh/mapforce.html) 提供了功能，让您可以在最小程度的干预下处理一组文件。 例如，我们最近从一款带有 GPS 功能的数码相机存储卡上复制了一组文件。 每个 .LOG 文件都是一个 CSV 文件，其中包含一条特定路线的 GPS 坐标。

![数据转换的源文件目录列表](https://lh4.ggpht.com/-Y_WZhryIjkY/UPl5wriQH7I/AAAAAAAAA9Q/EsluCIUq068/clip_image001%25255B3%25255D.png?imgmax=800 "Directory list of source files for data conversion")

我们迅速设计了一个转换方案，将 CSV 数据转换为基于 XML 格式的 .gpx 文件，并对所有三个文件进行了处理，从而在一次运行中生成了三个输出文件

![自动生成输出文件列表](https://lh3.ggpht.com/-_QzOFmBto78/UPl5xBjlsjI/AAAAAAAAA9Y/DIJBSZ6AdMw/clip_image002%25255B3%25255D.png?imgmax=800 "List of automatically generated output files")

<!--more-->

首先，我们在映射工具的“属性”对话框中，针对输入组件，使用了通配符来指定输入文件名。这指示 MapForce 软件分别处理工作目录中所有与该通配符匹配的文件。

![使用通配符指定映射输入文件](https://lh3.ggpht.com/-iqz0XDhHvLQ/UPl5xo-viaI/AAAAAAAAA9g/TO9klug7KLc/clip_image003%25255B3%25255D.png?imgmax=800 "Using a wildcard for the mapping input file")

如果您正在设计一个复杂的转换过程，或者输入文件非常大，您可以先使用一个唯一的文件名来创建映射关系，然后在您对映射结果满意后，再切换到使用通配符。

**文件路径函数**

内置的 MapForce 函数库包含文件路径函数，我们可以使用这些函数来管理输出文件名。如果我们定义一个输出文件，那么在处理每个新的输入数据时，新的数据将会追加到该文件中。

![MapForce 函数库中的文件路径相关函数](https://lh5.ggpht.com/-JxIKHZXrzEo/UPl5xzHgSnI/AAAAAAAAA9o/6APxltAkffU/clip_image004%25255B3%25255D.png?imgmax=800 "File path functions in the MapForce function library")

您可以将文件路径函数与其他字符串函数结合使用，从而完全控制输出文件的名称和位置。我们决定将输出文件保存在与输入文件相同的目录下，但为了创建更具描述性的文件名，并使用“.gpx”文件扩展名。

以下代码片段展示了如何使用字符串拼接函数以及文件路径函数，将文件 "1211190.LOG" 等文件转换为输出文件 "1211190converted.gpx"，以此类推。

![使用路径函数与字符串函数结合](https://lh4.ggpht.com/-l6ypssdA9Mg/UPl5ydkZBjI/AAAAAAAAA9w/2IfnpeT0TDY/clip_image005%25255B3%25255D.png?imgmax=800 "Using path functions with a string function")

您还可以使用文件路径函数来生成字符串，并将这些字符串作为输出。用于 .gpx 文件的 XML 模式包含一个元数据描述元素。我们决定将输入文件名插入到元数据中，以便明确地将输出文件与原始数据关联起来。这种方法使得输出文件具有自我描述性，并且在需要追溯意外输出时，可以帮助您找到原始数据源，从而方便调试。

以下代码片段展示了如何将源文件名插入到字符串中，并将该字符串映射到元数据 `<desc>` 元素：

![将文件名映射为输出数据](https://lh4.ggpht.com/-_NjzoK77594/UPl5zLiSFyI/AAAAAAAAA94/3E_Qvk6srt8/clip_image006%25255B3%25255D.png?imgmax=800 "Mapping the file name as output data")

结果描述显示在“[地图输出预览](https://www.altova.com/zh/mapforce/mapping-output.html)”的第4行

**(图片预览：显示带有文件名的数据输出。)**

**过滤输入数据**

这个数据映射的核心需要对输入文件进行过滤。摄像机的GPS日志文件是按照美国国家海洋电子协会（NMEA）的规范记录的。下面展示了其中一个输入文件的一部分：

![相机GPS日志中的示例数据](https://lh6.ggpht.com/-My1iWbnP1Fs/UPl5z4xF7tI/AAAAAAAAA-I/dmH9bWwphCI/clip_image008%25255B3%25255D.png?imgmax=800 "Sample data from the camera GPS log")

在第一行之后，每个记录点都由两个NMEA语句描述，其中语句类型在第一个字段中标识。每个GGA语句包含时间、纬度、经度、海拔高度以及关于定位质量的附加数据。每个RMC语句包含时间、纬度、经度和日期。

一个RMC语句包含了生成.gpx文件所需的最小数据 `<trkpt>` 元素，因此我们可以使用过滤器来选择输入中的特定行，就像这里展示的：

![筛选输入数据，提取行](https://lh5.ggpht.com/-u3MGw07n5Jg/UPl50MRDs2I/AAAAAAAAA-M/Jdm8sOiyLko/clip_image009%25255B3%25255D.png?imgmax=800 "Filtering the input data to extract rows")

如果某行数据的第一栏中的消息类型包含“$GPRMC”，则该行数据会被传递给后续处理模块。如果不是，则该行数据将被忽略。

输入文件中的实际数据也需要进行一些处理。对于每一个纬度和经度，我们需要将源文件中定义角度、分钟和秒的多个字段组合起来，并转换为十进制角度。我们还需要将时间和日期字段组合在一起，并将结果按照.gpx格式要求的ISO 8601格式记录下来，例如2012-11-19T20:43:23Z。为了封装这些转换的复杂性，并将它们与主程序分离，我们将每一种转换定义为用户函数。

这个地图也提供了一个机会，可以重用我们在之前的文章中定义的 `getElevationUS` 用户函数 [应对意想不到的情况——Altova MissionKit 解决了格式转换难题](https://www.altova.com/blog/2013/01/expect-unexpected-altova-missionkit.html). 这次，我们将海拔数据四舍五入到小数点后三位，以表示最接近的毫米。

CamerlogToGPX 数据映射的核心部分，以及其中包含的用户函数，大致如下所示：

![数据映射的核心在于与用户功能的集成](https://lh6.ggpht.com/-2HVaK82dfyo/UPl50fC_aHI/AAAAAAAAA-Y/1rMavSy31hM/clip_image010%25255B3%25255D.png?imgmax=800 "Core of the data mapping with user functions")

以下是一个输出文件示例，其中包含一个 `<trk>` 元素、一个 `<trkseg>` 元素以及多个 `<trkpt>` 元素。

![示例输出数据](https://lh6.ggpht.com/-HQudomQ_V9o/UPl51JbUgXI/AAAAAAAAA-g/OH2DiYSvrZU/clip_image011%25255B3%25255D.png?imgmax=800 "Sample output data")

“MapForce 输出”菜单提供了一组选项，允许我们验证输出文件是否符合 .gpx XML 模式

![验证结果](https://lh6.ggpht.com/-9PvYWtWIYh0/UPl51dQrWfI/AAAAAAAAA-o/1NI8SHJzfLg/clip_image012%25255B3%25255D.png?imgmax=800 "Validation results")

**如果您希望使用** [Altova MapForce](https://www.altova.com/zh/download-trial.html) **用于批量处理输入文件，以便您进行自定义的数据映射** [点击此处下载免费试用版](https://www.altova.com/zh/download-trial.html)**.**
