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

本文关键字:文件 管道 自定义 平面文件 拆分 | 更新日期: 2023-09-27 18:14:05

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

我尝试使用Selvan的自定义反汇编管道的好例子,但无济于事。

我已经使用管道组件向导来生成管道骨架,但是对于如何继续编写反汇编阶段的代码并拆分大文件的提示或指针,我将非常高兴。在这方面我还是个新手。

帮忙吗?

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

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

当它运行时,BizTalk通过"Disassemble"方法传递消息。在此方法返回之后,BizTalk开始轮询"GetNext"方法,直到它返回null以获得所有输出消息。因此,您需要设计的是如何在"Disassemble"方法中准备消息,以便在BizTalk调用"GetNext"时返回所需的拆分消息。

Selvan的方法是:

  • 在"Disassemble"中,使用BizTalk的平面文件反汇编器(base.Disassemble)将整个平面文件转换为XML,并让基类存储XML输出
  • BizTalk第一次调用"GetNext"时,未拆分的XML消息从基类(base.GetNext)中检索,并加载到XPathDocument中,并根据节点计数进行拆分。为每个部件创建一条新消息并保存在集合中。
  • 每次调用"GetNext"都会从消息集合中返回一条消息,直到它们全部返回为止,因此该方法返回'null'。

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

  • 第一次调用时,为反汇编的XML消息流创建XmlReader
  • 对于每次调用GetNext,使用XmlReader向前读入所需数量的节点,同时写入一个新的输出流,该输出流返回一个新的BizTalk消息。
  • 当你到达XML消息的末尾时,你可以关闭阅读器并返回null。

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