首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在BizTalk平面文件处理中丢弃任意标题行?

在BizTalk平面文件处理中丢弃任意标题行?
EN

Stack Overflow用户
提问于 2017-02-24 18:45:36
回答 1查看 407关注 0票数 1

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

BizTalk - Flat file with Header multiple records and Footer - Disassemble problem

Removing header from a flat file in BizTalk

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

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

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

我尝试过两种方法来解决这个问题:

  • 包含两个以回车分隔的字段元素的头架构,每个元素都是不透明的字符串。
  • 包含两个回行分隔的记录的头模式,每个记录定义一个虚拟的infix分隔符,该分隔符将永远不存在于两行中(导致每个记录一个不透明的字符串)。

然而,当我部署这些文件时,BizTalk将获取文件并处理它们,但是它实际上不会产生任何消息。这使我相信,BizTalk对待我的平面文件就好像整个文件是头文件一样,因此它没有找到任何记录。

我试图找到的解决方案是如何创建一个标头模式,使BizTalk将文件的前两行作为头,而不管它们的内容如何,并丢弃它们。这个是可能的吗?

编辑:不同文件的示例:

有记录:

代码语言:javascript
复制
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

此文件中没有记录:

代码语言:javascript
复制
2017-02-27 19:30:22
***EOF***
  • 第一行总是相同的,可以用位置分隔的记录来描述。
  • 第二行是以逗号分隔的列名列表,或者这条EOF行。
  • 只有在没有记录时,EOF才会出现。

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-28 14:16:54

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

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

例如(注:未经测试,可能有效的代码):

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42446108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档