利用Biztalk Flat File Disasembler来解析CSV文件
CSV文件作为一种的简单数据文件交换标准,在商业上活动尤其是B2B中被大量采用。
在Biztalk中可以使用Flat File Disasembler来解析这类格式的文件,以下样例采用Biztalk Server 2006 R2作为开发环境。
使用的csv样例文件内容如下 :
ItemNumber,Description,IssueDate,IssueUser,Status
00-011-003,微软Office2007,2008-9-27,uid01,A
00-022-234,Vista旗舰版,2008-4-1,uid02,D
00-101-001,"xbox 360, ""elite"" edition",2006-7-5,uid03,A
步骤如下:
Step 1: 在添加项目文件中选择Flat File Schema Wizard,启动平板文件schema向导。
Step 2: 输入样例文件以提供向导进行平板文件的结构分析,定义需要生成的Flat File Schema的根节点名称已经Namespace,
同时选择正确的代码页以对平板文件进行正确的解码。
Step 3: 选择前两行数据以提供结构分析,这里要注意的是一定要同时选中每行中最后两个字符,及回车换行符,这样做是为了进行行结构的分析。
整个向导中有两级分析过程,一级是行分析,一级是字段分析 。字段分析会在稍后进行介绍。
Step 4: 选择根据分隔符来解析还是使用相对位置来拆分行集,这里选择分隔符方式。
Step 5: 选择行分隔字符串,由于之前选中的是前两行文本内容,分析器会把选中的所有内容作为一条字符串来进行分析,
那么每行的内容就相当于被分隔符所划分出来的Child(或者说单元格),要把一套字符串分割为两行文字,自然需要使用windows的标准换行符{CR}{LF},即回车换行符。
Step 6: 设定分隔后的元素数据类型。文件头是固定的,所以采用Record类型,而内容则采用Repeating record类型,表示可以重复的记录项。
Step 7: 这样就定义出来根节点中的两个子节点,Header和Record。 选择Header以进行文件头字段的设置。
Step 8: 在Header的字段设置中,请选择前面提取出的样例文本的首行文字内容,注意这里不要选取回车换行符。
Step 9: 同样采用分隔符方式来进行字段级别的拆分。
Step 10: 这里的Child就是首行中的以逗号分隔的字段,按照CSV标准必须采用","进行分隔。
非CSV标准的结构化平板文件可以选择采用别的符号来进行字段的拆分,如tab等 。
Step 11: 按照样例内容提示来设置的Header节点在即将生成的Flat File Schema中的对应节点名称,已经xml中的元素类型(element或attribute)和数据类型。
Step 12: 按同样的方式来对Record节点进行设置。
Step 13: 通过向导设置完毕的Flat File Schema。
Step 14: 这一步比较关键,按照CSV标准,双引号属于特殊的字符,包含在双引号中的文字包括逗号分隔符会被当做文本内容进行处理,且文本中的双引号需要成对的双引号进行转义
如样例文档中第4行第2个单元格中的文本:"xbox 360, ""elite"" edition"
按CSV标准应该被解析为xbox 360, "elite" edition这样的内容。
在生成的Flat File Schema中,在其Schema层的属性栏中需要设置Default Wrap Character为双引号。
这样就将整个schema中的包装符号设置为了双引号。
但是还需要在每个字段中设置其Wrap Character Type的属性为Default Wrap Character,才能实际应用到每个单元格上。
(这一点设置上感觉比较麻烦,但毕竟Flat File Schema并不只是设计用于CSV这种需要Wrap Character的文件格式)
通过将schema文件的Generate Instance Output Type属性设置为“Native”即可测试看生成的xml文件是否正确。
Step15: 创建自定义的Pipeline,将Flat file disassembler组件从工具箱中拖入Disasseble stage中,
然后将 Flat file disassembler组件的Document Schema属性设置为刚刚创建的csv schema。
到此就已经创建完成能够解析CSV Flat File的自定义Pipeline组件,
在将其部署到Biztalk Application之后,只要在需要使用的Receive Location中选择此Pipeline即可。