使用mule在平面文件中混合记录格式

使用mule在平面文件中混合记录格式,mule,flat-file,Mule,Flat File,我又一次在骡子里把自己弄糊涂了 我必须接受来自供应商的平面文件,并且无法重新格式化该文件。该文件有大量具有固定宽度字段的记录,非常适合mule数据映射器。这很好,映射到JavaPOJO以创建要处理的记录集合 问题:文件中的最后一条记录是格式完全不同的摘要记录。问题是,格式不仅改变了数据布局,记录长度也改变了。数据映射器例外,因为记录对于格式定义来说太短 对于如何在一个文件中允许这种混合格式,或者替代标准的mule功能,我是否需要制作自定义的转换器来分割记录,并对记录长度做出反应,使其成为单独的格

我又一次在骡子里把自己弄糊涂了

我必须接受来自供应商的平面文件,并且无法重新格式化该文件。该文件有大量具有固定宽度字段的记录,非常适合mule数据映射器。这很好,映射到JavaPOJO以创建要处理的记录集合

问题:文件中的最后一条记录是格式完全不同的摘要记录。问题是,格式不仅改变了数据布局,记录长度也改变了。数据映射器例外,因为记录对于格式定义来说太短

对于如何在一个文件中允许这种混合格式,或者替代标准的mule功能,我是否需要制作自定义的转换器来分割记录,并对记录长度做出反应,使其成为单独的格式


是的,我知道这种类型的平面文件的使用已经过时,但是处理遗留系统需要接受生成的数据,直到系统可以退役。

您可以在csv属性中将错误策略设置为宽松。

我仍然对其他解决方案持开放态度,但我怀疑开箱即用的数据映射器能否实现这一点。对于我认为的一般解决方案来说,有点太深奥了

在听到一个精彩的解决方案之前,我当前的方法是使用java组件按记录分割文件,提取控制值,并通过选择控件按类型分隔记录。然后调用Java组件来映射字段,并在每个分支中分别为特殊记录和主体记录执行业务逻辑,例如:

<file:connector name="File" autoDelete="true" streaming="true" 
         validateConnections="true" doc:name="File"/>
<spring:beans>  
    <spring:bean name="sumRec" class="com.mypackage.SummaryRecord" />                
    <spring:bean name="detailRec" class="com.mypackage.DetailRecord" />
</spring:beans>

<flow name="FlatToFile">
    <file:inbound-endpoint path="/SourceDir/Work"
        moveToDirectory="/SourceDir/Archive" 
        doc:name="FlatFileIn" connector-ref="File" >
        <file:filename-wildcard-filter pattern="*.txt" caseSensitive="false" />
    </file:inbound-endpoint>

    <component class="com.mypackage.FlatFileReader" doc:name="Split file and dispatch to VM" />

</flow>

<flow name="processRecords">
    <vm:inbound-endpoint exchange-pattern="one-way" path="in" doc:name="VM" />

    <object-to-string-transformer doc:name="Object to String"/>
    <set-variable variableName="recType" value="#message.payload.substring(0,7)]" doc:name="Variable"/>

    <choice doc:name="Choice">
        <when expression="flowVars.recType == '9999999'" >
            <expression-component doc:name="Expression">
                message.outboundProperties.recCount =     app.registry.sumRec.process(message.payload);
            </expression-component>
        </when>
        <otherwise>
            <expression-component doc:name="Expression">
                app.registry.detailRec.process(message.payload);
            </expression-component>
        </otherwise>
    </choice>
</flow>
</mule>

message.outboundProperties.recCount=app.registry.sumRec.process(message.payload);
app.registry.detailRec.process(message.payload);

FlatFileReader从Java调用VM端点。

您可以发布一个3-4行的示例文件吗?也许您可以在传递到datamapper之前删除最后一条记录,或者像您所说的那样执行自定义转换器。这些文件是相对直接的,20-30000条固定长度的记录。每个字段从一个记录控制值开始,然后是一些固定长度的字段,非常适合数据映射器,直到最后一条记录。它以一个特殊的控制值开始,然后长度不是200个字符,而是只有20-24个字符,并且不保留记录的固定长度,甚至不保留其最后一个字段。没有看到包外数据映射器处理此问题的任何方法。我将尝试在该区域中播放。不幸的是,对我来说,这些文件甚至不是CSV,而是固定宽度,更糟糕的是,它们违反了自己的固定宽度规范。