1

我找到了这些相关的线程,但它们没有直接回答我的问题:

BizTalk - 带有标题多条记录和页脚的平面文件 - 反汇编问题

从 BizTalk 中的平面文件中删除标题

我正在处理一个旧系统,它提供具有非常松散架构的平面文件。特别是,标题由两行组成:第一行是标题,第二行是列标题。所有后续行都是有效记录。

问题是当那天没有记录时,列标题被省略;在这种情况下,我们有文档标题,然后是一个摘要行(供人类使用),通知读者当天没有记录。

因为同一个文件可以有如此不同的格式,所以我很难创建一个可以在我的平面文件接收管道中使用的头模式,这将允许我剥离头信息。此外,由于标题是多行,看来我不能只使用回车分隔符。

我尝试了两种方法:

  • 包含两个回车符分隔的字段元素的标头模式,每个元素都是不透明的字符串
  • 包含两个回车分隔记录的标题模式,每个记录都定义了一个虚拟中缀分隔符,该分隔符永远不会存在于任何一行中(导致每条记录一个不透明的字符串)

但是,当我部署这些文件时,BizTalk 会拾取文件并处理它们,但它实际上不会产生任何消息。这使我相信 BizTalk 将我的平面文件视为整个文件是标题,因此它找不到任何记录。

我试图找到的解决方案是如何创建一个标头架构,使 BizTalk 将文件的前两行视为标头,无论其内容如何,​​并丢弃它们。这可能吗?

编辑:不同文件的示例:

存在记录:

2017-02-27 19:27:03
CustomerName, OrderNumber, Expedite, ItemNumber, Count
CustomerA, O196801, 0, I232, 2
CustomerA, O196801, 0, I255, 1
CustomerB, O196802, 0, I237, 1
CustomerC, O196803, 0, I214, 1
CustomerC, O196803, 0, I232, 2

此文件中没有记录:

2017-02-27 19:30:22
***EOF***
  • 第一行总是相同的,并且可以用位置分隔的记录来描述。
  • 第二行是逗号分隔的列名列表,或此EOF行。
  • EOF仅在没有记录时出现。

目前,我只能通过将标题和文档模式之间的分隔符定义为整个列标题行来处理带有记录的文件,即CustomerName, OrderNumber, Expedite, ItemNumber, Count{CR}{LF} ,但是,当它找到空文件***EOF***而不是列标题字符串时,此标题模式会失败。

4

1 回答 1

0

使用平面文件模式可能有一些聪明的方法来处理这个问题,但我想不出。

我可能会考虑Decode为管道编写一个自定义组件,该组件将检查消息的前几个字节***EOF***- 如果是这样,只需将流清空(或者用预期的标头重写它) - 如果不是,重置位置流回到 0 并将其传递。

例如(注意:未经测试,可能工作代码):

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
{
    if (pInMsg == null || pInMsg.BodyPart == null) return pInMsg;

    var stream = pInMsg.BodyPart.GetOriginalDataStream();
    if (stream == null || stream.Length == 0) return pInMsg;

    if (!stream.CanSeek)
    {
        stream = new ReadOnlySeekableStream(stream);
        pContext.ResourceTracker.AddResource(stream);
    }

    StreamReader reader = new StreamReader(stream);
    pContext.ResourceTracker.AddResource(reader);
    reader.ReadLine(); // date line
    if (reader.ReadLine() == "***EOF***")
    {
        pInMsg.BodyPart.Data = null;
    }
    else 
    {
        stream.Position = 0;
        pInMsg.BodyPart.Data = stream;
    }
    return pInMsg;
}
于 2017-02-28T14:16:54.837 回答