我正在尝试为 BizTalk 2010 创建一个自定义管道组件,它将传入的平面文件拆分为多个较小的文件。我想将文件(假设大约 30 000 行)拆分为每个大约 5000 行或更少的文件(假设文件包含 33 000 行)。
我尝试过使用Selvan's great example自定义反汇编管道无济于事。
我已使用管道组件向导生成管道骨架,但对于有关如何继续对反汇编阶段进行编码并拆分大文件的任何提示或指示,我将非常满意。我对这种类型的编码几乎是新手。
有什么帮助吗?
最佳答案
拆分消息只能使用反汇编器组件来完成。您可以创建一个继承自现有反汇编器的类(就像 Selvin 所做的那样),也可以指定要在管道组件向导中为接收管道类型创建“DisassembleParser”组件类型。如果您可以重用设计时属性,则继承很有用,但不是必需的。
运行时,BizTalk 通过“反汇编”方法传递消息。此方法返回后,BizTalk 开始轮询“GetNext”方法,直到它返回 null 以获取所有输出消息。因此,您需要设计的是如何在“Disassemble”方法中准备消息,以便在 BizTalk 调用“GetNext”时返回所需的拆分消息。
Selvan 的方法是:
- 在“反汇编”中,使用 BizTalk 的平面文件反汇编程序 (base.Disassemble) 将整个平面文件转换为 XML,并让基类存储 XML 输出
- BizTalk 第一次调用“GetNext”时,将从基类 (base.GetNext) 检索未分割的 XML 消息,并将其加载到 XPathDocument 中,并根据节点计数进行分割。为每个部分创建一条新消息并将其保存在集合中。
- 每次调用“GetNext”都会从消息集合中返回一条消息,直到所有消息都返回为止,因此该方法将返回“null”。
正如他所指出的,使用 XPathNavigator 不适用于非常大的消息。如果可以的话,最好使用 XmlReader,以便可以将消息作为流进行处理,而无需完全加载到内存中。这可以通过将 GetNext 流程重新设计为来完成:
- 第一次调用时为反汇编的 XML 消息流创建 XmlReader。
- 对于每次调用 GetNext,使用 XmlReader 向前读取所需数量的节点,同时写入随新 BizTalk 消息返回的新输出流。
- 到达 XML 消息末尾后,您可以关闭阅读器并返回 null。
根据您的描述,听起来您可能希望输出平面文件而不将其分解为 XML,在这种情况下,我建议在调用 Disassemble 时保存输入流,然后使用相同的 GetNext 设计但使用 StreamReader XmlReader 的一个。
关于c# - 使用自定义管道将平面文件拆分为较小的文件(按行数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741756/