FME作为转换神器,支持几百种格式的互转,实现互操作化。从fme.exe执行方式入手,讨论Command命令式执行模板(.fmw/.fmwt)和脚本(.tcl/.py)实现自动化批量转换。

1、fme.exe命令分析

一般打开CMD命令后直接输入fme可执行,系统环境变量已将FME按照目录加进去了。

图1 fme.exe命令

从红圈看出FME本身执行也是靠fme.exe来执行ControlFile(控制文件)和ScriptFile(脚本文件)的。对于ControlFile可以利用FMEWorkBench来制作,对于ScriptFile有2种方式:FMEWorkBench和FMEQuickTranslator【这里是FME2014】来创建。

注:其他命令和参数设置这里不做详述。

2、批量自动化转换

(1)ScriptFile方式,.tcl控制内容,.bat执行

此处可在【FME Desktop Help】中 FME Workbench > Workspace Basics > Running and Debugging Workspaces > Running a Batch Translation找到相关内容。

FMEWorkBench在制作完.FMW后,可在File—BatchDeploy向导式部署导出BAT和TCL脚本,数据源选择可以使用增加数据源目录或多个文件。

图2 batch数据源设置

FMEQuickTranslator可以用Tools—CreateBatch来创建,数据源设置目录或文件与图2相同,设置原始数据格式和原始数据格式,再设置Batch导出。

图3 FMEQuickTranslator批量脚本

  生成后.bat文件就一行,fme开头执行.tcl文件。

  .tcl文件存储了基本的设置:工作空间、原始数据及格式、目标数据及格式,日志,相关转换等参数,可用记事本打开查看和随时改动,脚本方式执行.bat文件即可完成批量自动化转换。

(2)ControlFile方式,Process程序执行【fme.exe ControlFile PublishParams】

此处可在【FME Desktop Help】中 FME Workbench > Workspace Basics > Running and Debugging Workspaces > Working with Command Files找到相关内容。

执行方式如下:

Fme.exe  [.fmw/.fmwt文件]  [对应发布参数]

Eg:

fme.exe  c:\temp\command.fmw

--SourceDataset_ACAD "\"\"C:\FMEData\Data\Water\distribution_L25.dwg\"   \"C:\FME Data\Data\Water\distribution_L26.dwg\"\""

--DestDataset_DGNV8 c:\temp\output.dgn

LOG_FILENAME  c:\fme.log

  可以看到关键在于发布参数的动态设置,一个完整的工作空间中有那么几个需要自定义的参数需要设置,UserParameter设置对应PromptAndRunTranslation(提示并运行转换)相关参数是对应的,而且用户发布参数决定着整个工作空间运行的情况。

图4 用户发布参数与转换参数对应

  程序执行批量自动化转换:一是提取FME核心和注册表相关来进行命令组合,类似于打开CMD后输入命令,不过是程序实现;二是自动提取FME用户发布参数,这个是核心,需要从.fmw中提取。

这里仔细描述下用户发布参数提取方式,由于是从.fmw文件中提取的,记事本或写字板打开一个.fmw文件,搜索“DEFAULT_MACRO”,我们就可以找到用户发布参数显示的地方,如下例为1个【DestDataset_GEODATABASE_FILE】发布参数,后面加地址,GUI指出文件类型,而此“DEFAULT_MACRO”和“GUI”组成一个发布参数。

DEFAULT_MACRO   DestDataset_GEODATABASE_FILE E:\KSDE\test.gdb

GUI DEST_GEODATABASE   DestDataset_GEODATABASE_FILE Destination ESRI Geodatabase (File-based) File:

那么如何利用程序从.fmw中提取出这些发布参数?

  分析:.fmw文件中针对“DEFAULT_MACRO”和“GUI”组合的内容有很多,只有前部分是用户发布参数,后部分是工作空间数据源、目标数据、转换器等的相关参数,区分标识在于标签:#! START_HEADER、#! END_HEADER,在此标签(当做XML标签)之间又有:

  #!  START_WB_HEADER、#!  END_WB_HEADER;

  #!  START_SOURCE_HEADER、#!  END_SOURCE_HEADER;

  #!  START_DEST_HEADER、#!  END_DEST_HEADER;

  利用XML形式表达层次为:

 < START_HEADER>
< START_SOURCE_HEADER>
<START_WB_HEADER><END_WB_HEADER>
< END_SOURCE_HEADER>
< START_DEST_HEADER>
<START_WB_HEADER><END_WB_HEADER>
< END_DEST_HEADER>
< END_HEADER>

  由此可通过标签过滤得到用户发布参数,再通过“GUI”识别类型,通过换行符“\”和分隔符“ ”进行分割得到每个发布参数,最后程序实现读取发布参数。因此,可实现读取和存入数据,动态的执行.fmw,达到批量自动化数据转换。

  给出发布参数读取方法供参考,过程源于【参考1】:

  1)、通过标签进行过滤得到《用户发布参数》范围。

 public List<FMEParameter> GetParameters(string fmeFile)
{
List<FMEParameter> list = new List<FMEParameter>();
XmlDocument document = null;
string str = null;
char[] trimChars = new char[] { '#', '!', ' ' };
using (StreamReader reader = new StreamReader(fmeFile, Encoding.Default))
{
StringBuilder builder = new StringBuilder();
while (!reader.EndOfStream)
{
str = reader.ReadLine().Trim();
if (str.StartsWith(Resource.StringFMWXmlPrefix))
{
if (str == Resource.StringFMWXmlPrefix)
{
break;
}
builder.Append(string.Format("{0} ", str.TrimStart(trimChars)));
}
}
document = new XmlDocument();
try
{
document.LoadXml(builder.ToString());
}
catch (Exception)
{
document = null;
}
}
if (document != null)
{
foreach (XmlNode node2 in document.SelectSingleNode(Resource.StringFMWParameterPath))
{
FMEParameter item = this.GetParameter(node2);
if (string.IsNullOrEmpty(item.Name))
{
Trace.WriteLine(node2.Attributes[Resource.StringFMWParameterDefaultValue].Value);
}
else
{
list.Add(item);
}
}
}
return list;
}

2)、《用户发布参数》范围解析,得到FME发布参数

 private FMEParameter GetParameter(XmlNode node)
{
FMEParameter parameter = new FMEParameter {
DefaultValue = node.Attributes[Resource.StringFMWParameterDefaultValue].Value
};
string input = node.Attributes[Resource.StringFMWParameterInfo].Value;
parameter.Optional = Regex.IsMatch(input, @"GUI\s+OPTIONAL\s+", RegexOptions.IgnoreCase);
parameter.Published = !Regex.IsMatch(input, @"GUI\s+OPTIONAL\s+IGNORE\s+|GUI\s+IGNORE\s+", RegexOptions.IgnoreCase);
input = Regex.Split(input, @"GUI\s+OPTIONAL\s+IGNORE\s+(.+)|GUI\s+IGNORE\s+(.+)|GUI\s+OPTIONAL\s+(.+)|GUI\s+(.+)", RegexOptions.IgnoreCase)[];
string[] strArray = Regex.Split(input, @"([^\s]+)\s+([^\s]+)\s+(.+)", RegexOptions.IgnoreCase);
parameter.Type = strArray[];
parameter.Name = strArray[];
if (this.hasConfiguration(parameter.Type))
{
strArray = this.SplitConfigurationPrompt(strArray[]);
parameter.Configuration = strArray[];
parameter.Label = strArray[];
return parameter;
}
parameter.Label = strArray[];
parameter.Configuration = string.Empty;
return parameter;
}

  总结:通过fme.exe命令执行方式探讨了2种批量自动化数据转换方法,详细论述了具体实现过程和关键技术点,提供相关参考。

  另:有【自定义FME批处理脚本,安图博客  】,通过DOS命令,自定义设置FME模板、数据源路经、目标数据路径、以及日志等信息,基本也属于命令执行范畴。

  【引用已说明出处,转载请说明出处。】

  参考:

  [1] FME 开发篇(二).安图163博客,2014.5 

谈FME批量自动化数据转换方法的更多相关文章

  1. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  2. SharePoint自动化系列——通过PowerShell在SharePoint中批量做数据

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ PowerShell是基于.NET的一门脚本语言,对于SharePoint一些日常操作支持的很好. ...

  3. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  4. HBase BulkLoad批量写入数据实战

    1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据.使用Sqoop工具批量导数到HBase集群.使用MapReduce批量导入等.这些方式, ...

  5. AdMaster技术副总裁谈Hadoop、营销数据、Python和挖掘平台

    http://www.infoq.com/cn/news/2014/09/admaster-hadoop 卢亿雷是现任AdMaster技术副总裁,曾在联想研究院.百度基础架构部.Carbonite C ...

  6. 基于ArcGIS的CAD数据向GIS数据转换方法(转)

    基于ArcGIS的CAD数据向GIS数据转换方法 1 CAD数据与ArcGIS数据介绍 地图数据来源多种多样,大多数使用的是计算机辅助设计软件(CAD)制作的数据,CAD软件制图自动化程度高,操作简单 ...

  7. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  8. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  9. 改用C++生成自动化数据表

    改用C++生成自动化数据表 前面的文章中,我们讨论了使用一个基于.NET的第三方程序库来从程序中来生成数据表.在我看来,这整个思路是非常有用的,例如为显示测试结果.我经常会自己在博客中尝试各种像这样的 ...

随机推荐

  1. U-Mail邮件系统六项特色服务铸就金口碑

    评价一款邮件系统优劣的标准或许有很多,左右你是否选择某个平台的需求或许有不同,但是U-Mail小编必须提醒你:服务水准不可等闲视之!之所以如此, 这是因为:现代社会垃圾邮件猖獗,病毒层出不穷令人防不胜 ...

  2. Android_AsyncTaskDemo之QQ记步数(画圆形图片知识)

    今天学习了AsyncTask Android 的异步机制.我简单的实现我的一个小小案例--qq记步数.然后穿插一个画圆形图片的知识点. 由于所学知识有限,目前我计数,还有排名等等我就简单的利用随机数实 ...

  3. C#中Invoke 和 BeginInvoke 的区别

    Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...

  4. Web 项目中分享到微博、QQ空间等分享功能

    Web 项目中分享到微博.QQ空间等分享功能 网上有很多的模板以及代码,但是有很多都不能分享内容,简单的测试了下: 以新浪微博为例,文本框中的内容是title属性,下面的链接是url属性,如果你的链接 ...

  5. Appium学习路—脚本篇(启动app)

    启动之前的准备   1.脚本执行前,需要先启动appium的server端, 启动server方法: 打开appium客户端,点击右上角的Launch     2.iOS的测试只能在mac本上做   ...

  6. 生成SSH key

    1.打开终端 2.输入cd ~/.ssh 3.输入ssh-keygen -t rsa -C (邮箱) 4.前往文件夹 /Users/admin/.ssh/id_rsa 5.找到id_rsa.pub , ...

  7. 关于js原型继承

    js的每个类都有一个prototype对象 访问对象的属性时,会先访问到对象自身是否有定义这个属性 如果没有定义,就会去访问对象所属类型的prototype对象是否有此属性 原型继承就是把类型的pro ...

  8. Oracle:ORA-00955: name is already used by an existing object

    下午从生产库导出了一份表结构,用来测试一些问题,由于生产库连接着其他用户下的表所以通过视图在本地模拟一下,于是创建视图: create or replace view csews as select ...

  9. JavaWeb 学习0010-今日问题 2016-12-3

    2016-12-3 1. 今天要做的第一个问题就是,怎么把网页变得好看点: addStudent/listStudent页面都有改动 其中 list页面还有了<c:if 的语句这是还没练习过得知 ...

  10. curl 模拟登录微信公众平台带验证码

    这段时间一直写个项目, 从切图到前端到后台都要搞定,真tm累. 今天下午手残,不停用错误的密码去模拟登录微信公众平台,结果后来出现验证码,瞬间悲剧(菜鸟从来没搞过带验证码的). 研究了一下,发现其实很 ...