FlatFile 端口能够实现平面文件与XML文件的互相转换。
每个 Flat File 端口配置一个特定的平面文件格式,从而实现与 XML 格式的互相转换。Flat File 端口有两个主要的模式:
- Position Delimited
- Character Delimited
对于 Position Delimited 平面文件,端口 设置 选项卡下的 行类型 中,可以配置任意的字段名称、索引(即位置)和长度,表明数据在平面文件中每一行出现的位置。
对于 Character Delimited 平面文件,端口配置有分隔平面文件中字段值的字符。
Flat File 端口支持定义多种平面文件中不同类型的行。例如,平面文件中可能有一个 “header” 行,代表订单的日期,有多个 “item” 行,代表订单中的行项目。
定义多种行类型的关键是指定控制字段;控制字段值决定了在平面文件中特定的行类型(例如,header 行可能有一个控制字段值为 “HEAD”,item 行可能有一个控制字段值为 “ITEM”)。
平面文件格式配置完后,端口会转换与此格式匹配的文件到 XML。最终的 XML 结构在 XML 格式部分有详细解释。Flat File 端口也可以将匹配这种结构的 XML 转换为定义的平面文件格式。
某些平面文件在不同行有隐含的上下级关系。
端口配置
配置部分
端口 Id:端口的静态、唯一标识符。
端口类型:显示端口类型及其用途的描述。
端口描述:一个可选字段,用于提供端口及其在流中的角色的自由格式描述。
文件类型:Position Delimited – 平面文件中的字段显示在每一行的特定位置。
Character Delimited – 这个属性需要指定特定的分隔符。
分隔符:如果文件类型设置为 Character Delimited,则表示平面文件中用于分隔各个字段的字符。
控制字段:位置分离
控制字段主要用于位置分隔,这里主要完成和控制字段有关的设置,决定了在平面文件格式中定义的不同的行类型。
多行模式:平面文件是否包括多种行类型。
起始索引:如果多行模式启用,该值就是行中控制字段开始的索引。例如,如果某一行中的第一个字段定义了行类型(即第一个字段是控制字段),那么起始索引就是 0。
控制字段长度:(可选)如果多行模式启用,这个值定义了从起始索引开始读取控制字段的长度。
当前列标题:如果不启用多行模式,这个设置则决定了平面文件中的第一行是否应该被解析为列标题(即每个字段的名称而不是实际的数据)。同样的,启用这个设置,就会使得端口在将文件从 XML 转换为平面文件时生成一个标题行。
控制字段:字符分隔
和控制字段有关的设置,决定了在平面文件格式中定义的不同的行类型。
多行模式:平面文件是否包括多种行类型。更多信息请查阅多种行类型部分
字段索引:如果多行模式启用,该值就是行中(索引从 0 开始)控制字段的索引。例如,如果某一行中的第二行定义了行的类型(即第二行是控制字段),那么字段索引就是 1。
生成字段/行类型名称:如果多行模式启用,那么该设置提供了一个选项,在平面文件中 不 指定字段和行的名称和索引。当启用这个设置,端口将会自动为下面行类型中没有明确定义的字段和行生成 XML 元素。
当前列标题:如果不启用多行模式,这个设置则决定了平面文件中的第一行是否应该被解析为列标题(即每个字段的名称而不是实际的数据)。同样的,启用这个设置,就会使得端口在将文件从 XML 转换为平面文件时生成一个标题行。
使用自动生成的字段名称:如果多行模式没有启用,这个设置决定了端口是否生成通用字段名称。不启用该选项,在行类型部分手动指定字段名称。
行类型
该部分允许以平面文件格式定义字段名和位置(如果文件类型是 Position Delimited)。
如果多行模式启用,使用添加行类型按钮定义。每个行类型有一个控制字段,来标识行类型。例如,header 行可能有值为 HEAD 的控制字段,item 行可能有值为 ITEM 的行。
如果文件类型设置为 Character Delimited,多行模式启用,生成字段/行类型名称 启用,那么为平面文件中存在的所有字段和行类型提供名称和索引就不是必需的。
高级
填充字符:当创建平面文件但字段值不能填满整个字段长度时,这个字段会被用来填满剩余部分。
无效的XML名称前缀:某些字段名对于 XML 元素时无效的(例如,以数字开头的字段像 “123ABC”),所以在从平面文件生成 XML 时必须设置一个前缀。同样的,当从 XML 转换 平面文件时,端口会查找该前缀并去除它。
行分隔符:指定行与行之间的分隔符。选项为 LF (默认) 和 CRLF。
本地文件名格式:用于为端口输出的消息分配文件名的方案。 可以在文件名中动态使用宏来包含标识符和时间戳等信息。 有关详细信息,请参阅宏。
嵌套行类型:该设置仅在从平面文件转换到 XML 文件时,且在平面文件中有多种行类型时才相关。如果多行模式启用,端口将会根据平面文件的控制字段行(即定义行类型的字段)增加层级关系到最终的 XML。
行尾填充:默认设置下,端口会在遇到异常的行尾时抛出错误。当启用时,该设置告知端口填充端口而不是抛出错误。
始终使用单元格分割符:如果文件类型设置为 Character Delimited时,打开此设置以使端口始终使用单元格分隔符(”)包装所有值,关闭此设置后端口仅会包装还有分隔符的值。
延迟处理放置:在输入文件夹中的文件的处理延迟的时间量(以秒为单位)。 这是一个遗留设置。最佳实践是使用 File 端口 来管理本地文件系统,而不是此设置。
定义平面文件格式
配置 Flat File 端口的第一步就是定义平面文件的格式。本部分介绍具有单行类型的格式,换句话说,平面文件中的每一行都具有相同的字段集。对于有多个不同行类型的平面文件,请查阅多种行类型 部分。
Character Delimited 的单行格式
对于 Character Delimited 的平面文件,定义格式很简单:通过分隔符属性指定平面文件中分隔不同字段的字符。
当前列标题 字段说明了平面文件中的第一行是否是标题行;换句话说,它包含了字段名称而不是实际数据。如果这些列标题存在,端口将会使用这些标题名称作为最终转换成的 XML 中的 XML 元素名。
如果列标题不存在,端口支持通过在行类型中添加字段,手动指定每一个字段的名称。这些字段名称按照索引顺序应用,意味着行类型中的第一个条目将会是平面文件行中第一个字段的名称,以此类推。
端口也可以通过启用使用自动生成的字段名称来自动生成通用的字段名称。
Position Delimited 的单行格式
对于 Position Delimited 的平面文件,定义格式需要指定在格式中每个字段的位置。端口设置中行类型部分为平面文件中存在的行增加任意数量的字段。每个字段必须使用名称和其在平面文件中出现的位置进行标识。
当前列标题 字段表明了平面文件中的第一行是否为标题行;换句话说,它包括了字段名称而不是实际数据。字段名称仍然需要在行类型部分中配置,且这个设置简单地保证了标题行不被识别为实际数据。
多种行类型
如果平面文件格式包括了多种行类型,多行模式属性应该被启用。平面文件中标识行类型的字段被称为控制字段。
Character Delimited 的多种行类型
当文件类型为 Character Delimited,字段参数设置决定了控制字段出现在平面文件中每一行地位置。该索引从 0 开始,意味着如果控制字段是行中的第 5 个值,那么字段索引就应该是 4。
对于可能出现在控制字段的每个值,在端口设置行类型单击增加行类型按钮。标识行类型的值应该在该行的控制字段值中设置。
一旦每个可能的行类型通过特定的控制字段值被添加和标识,在每行中将出现的字段应根据索引顺序指定。
如果生成字段/行类型名称启用,为在平面文件中存在的所有字段或行类型(只有控制字段必需)提供名称和索引是必需的。在这种情况下,端口将会为任何未定义的字段或行类型自动生成 XML 元素。
Position Delimited 的多种行类型
当文件类型是 Position Delimited,起始索引设置决定了控制字段在平面文件中每一行出现(开始)的位置。这个索引从 0 开始,意味着如果控制字段从行中第 15 个字符开始,那么字段索引就应该是 14。
对于可能出现在控制字段的每个值,在端口设置行类型单击增加行类型按钮。标识行类型的值应该在该行的控制字段值中设置。
一旦每个可能的行类型通过特定的控制字段值被添加和标识,在每行中将出现的字段应根据所处(开始)的位置指定。
多种行示例
例如,某个平面文件包括两种类型的行,一个 shipment 行和一个 package 行。shipment 行包括发货的日期、时间和地址信息,package 行类型包括了发货的项目信息。
shipment 行可能有一个值为 “SHIP” 的控制字段值,package 行可能有一个值为 “PCKG” 的控制字段值。每一行的第一个字段是 “SHIP” 或 “PCKG” 来说表明该行是什么类型。
针对这种情况,多行模式应该被启用,且字段索引(或起始索引)应设置为 0,表明控制字段是该行中的第一个字段。然后,在行类型部分应该配置有两种行类型;一种控制字段值为 “SHIP”,包括 shipment 行的每个字段(例如发货日期,交付日期,收货地址等),一种控制字段值为 “PCGK”,包括 package 行的每个字段(例如项目名称,项目重量等)。
XML 格式
在平面文件转换为 XML 文件之后,结果应有如下的 XML 结构:
位于文件根部的 Items 元素
平面文件中的每一行有一个与该行控制字段值相同的元素(如果未定义控制字段值,则是“行”)
行中的每个字段是控制字段值元素的子元素
例如,如果平面文件有 “SHIP” 和 “PCKG” 行,那么输出的 XML 会和此格式相似:
<Items><SHIP><ShipmentId>12B992</ShipmentId><Date>20200228</Date><ShipTo>14 Wallaby Way</ShipTo></SHIP><PCKG><ShipmentId>12B992</ShipmentId><ItemName>Goggles</ItemName><ItemWeight>3.98</ItemWeight></PCKG><PCKG><ShipmentId>12B992</ShipmentId><ItemName>Fins</ItemName><ItemWeight>1.07</ItemWeight></PCKG>
</Items>
转换 XML 文件为平面文件,输入的 XML 必须与上面的结构匹配(包括字段名称必须与端口配置中定义的字段匹配的限制)。
转换 XML 文件为平面文件,端口将在最终的平面文件中为每个 row 元素创建一个新行。对于 row 元素的每个子元素,端口将会将其与端口配置中字段名称匹配, 并将该元素放到合适的字段索引。
了解更多 EDI 信息,请参阅: EDI 是什么?