使用自定义管道将平面文件拆分为更小的文件(按行计数)

Split Flat Files into smaller files (on row count) using Custom Pipeline

我正在尝试为 BizTalk 2010 创建自定义管道组件,将传入的平面文件拆分为多个较小的文件。我想将文件(比如约 30 000 行)拆分为每个文件约 5000 行或更少的文件(假设文件包含 33 000 行)。

我已经尝试使用 Selvan's great example 的自定义反汇编管道,但无济于事。

我已经使用流水线组件向导生成了流水线骨架,但如果有任何关于如何继续对反汇编阶段进行编码和拆分大文件的提示或指示,我将非常高兴。我几乎是这种编码的新手。

有什么帮助吗?

拆分消息只能使用反汇编程序组件来完成。您可以创建一个继承自现有反汇编程序的 class(就像 Selvin 所做的那样),或者您可以指定要在管道组件向导中为接收管道类型创建一个 "DisassemblingParser" 组件类型。如果您可以重用设计时属性但不是必需的,则继承很有用。

当它是 运行 时,BizTalk 通过 "Disassemble" 方法传递消息。在此方法 returns 之后,BizTalk 开始轮询 "GetNext" 方法,直到它 returns null 以获取所有输出消息。所以你需要设计的是如何准备"Disassemble"方法中的消息,这样你就可以在BizTalk调用"GetNext".

时return需要的拆分消息

Selvan 的做法是:

  • 在 "Disassemble" 中,使用 BizTalk 的平面文件反汇编器 (base.Disassemble) 将整个平面文件转换为 XML,并让基础 class 存储 XML输出
  • BizTalk 第一次调用 "GetNext" 未拆分的 XML 消息从基础 class (base.GetNext) 中检索并加载到 XPathDocument 中并根据节点拆分计数。为每个部分创建一条新消息并保存在一个集合中。
  • 每次调用 "GetNext" returns 来自消息集合的消息之一,直到它们都被 returned 所以方法 returns 'null'.

正如他所说,使用 XPathNavigator 不适用于非常大的消息。最好尽可能使用 XmlReader,这样消息就可以作为流进行处理,而无需完全加载到内存中。这可以通过将 GetNext 流程重新设计为:

  • 第一次调用时为反汇编的 XML 消息流创建 XmlReader。
  • 对于 GetNext 的每次调用,使用 XmlReader 向前读取所需数量的节点,同时写入新的输出流,return使用新的 BizTalk 消息编辑。
  • 当您到达 XML 消息的末尾时,您可以关闭 reader 和 return null。

从你的描述来看,你可能想要输出平面文件而不将它们反汇编成 XML,在这种情况下,我建议只在调用 Disassemble 时保存输入流,然后使用相同的 GetNext设计,但使用 StreamReader 而不是 XmlReader。