移动报表数据接口的作用是把来自报表平台的数据文件转入到移动报表的本地数据库中。
数据文件是CSV格式,无标题行.
1 CSV文件转入本地数据库的方法
数据文件是为eReport生成的,因此容易自然地假定从文本文件到数据库是不需要进行转换的。
但这种限制会影响程序的适应性.
从数据文件到本地数据库是否需要对文本数据的列进行转换,是影响解决方案选择的重要因素。
如果需要支持列-字段的数据转换,有以下选择:
(1)通过BillCom先进行转换,把源文本文件转换为中间文件,再对中间文件进行处理
优点:可以利用BillCom的的转换能力
缺点:中间文件环节增加了开销,影响性能
(2)实现一个表达式计算器,导入时处理转换,可利用lua实现
(3)通过中间库,先不加转换地写入中间库,然后利用SQL在抽取阶段实现转换
缺点也是增加了中间环节
(4)利用Microsoft Text Driver实现
可以利用Jet SQL的函数进行转换
拟采用方案4.
利用Microsoft Text ODBC Driver直接处理CSV数据文件,无需开发CSV解析器,并且有Jet SQL对转换的支持
如:select len(f1),f2,NOW() from shop.txt是有效的语句
此方案的缺点是只支持Windows。dxi_csv可以做为后台任务独立部署,不会影响应用服务器跨平台的要求。
(如果需要跨平台,则考虑采用libcsv_parser++,并增加lua脚本支持字段函数转换)
2 接口处理
l
接口处理有2个步骤:
(1)数据文件下载
利用kiwi的ftpsync把数据文件下载到本地服务器,下载文件保存在配置的目录下,dxi_csv以此为输入,对其中的文件按顺序处理,每种类型的文件按文件名中指示的顺序号处理。
(2)数据文件处理
开发一个dxi_csv插件,负责eReport的接口文件的处理.
不同的文件类型可配置成并行处理.
同一类型的文件只处理最后的一个文件.
每种数据文件的处理逻辑在dxi_csv.conf中配置。
数据文件的处理逻辑如下:
l 通过ADO读入数据文件内容,字段和目标数据表的字段名称相同
l 生成数据文件记录的INSERT语句,并执行
l 如果违反唯一性约束,则按修改处理此记录
l 每个数据文件的处理在一个事务中
处理后的文件根据配置是否转储.
如果处理失败,则根据错误类型判定是否需要重做.
错误信息输出到系统日志表中,系统管理员通过系统日志功能查看.
ftpsync,dxi_csv和eReport可以各自部署.
3 dxi_csv实现
dxi_csv数据文件处理主要活动如下:
l 遍历file_path>目录下的指定类型(并行处理)或全部txt后缀的文件
l 确定需要处理的文件(根据文件流水号排序,确定最后的文件)
l 利用Jet数据库引擎读数据文件
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\temp\t\;Extended Properties="text;HDR=No;FMT=Delimited"; |
l 遍历记录:对每条记录生成INSERT语句,执行,如果是违反唯一性约束,则执行修改
l 执行成功后备份文件,备份文件自动分目录组织.
3.1 配置(dxi_csv.conf)
<?xml version="1.0" encoding="gb2312" standalone="no" ?> |
4 参考资料
l Microsoft Text ODBC Driver
http://www.connectionstrings.com/providers/microsoft-text-odbc-driver
l Connect to Text Files with the Microsoft Jet ODBC Text Driver
http://www.users.drew.edu/skass/sql/TextDriver.htm
l csv-parser-cplusplus
http://code.google.com/p/csv-parser-cplusplus/
l A Fast CSV Reader
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
l Comparison of Microsoft Jet SQL and ANSI SQL
Microsoft Jet database engine SQL is generally ANSI -89Level 1 compliant.