Spring batch FlatFileParseException Spring批处理

Spring batch FlatFileParseException Spring批处理,spring-batch,filereader,Spring Batch,Filereader,在作业配置中使用FlatFileItemReader时,我遇到平面文件解析异常 <bean id="masterFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <property name="resource" value="#{stepExecutionContext['fileResource']}" />

在作业配置中使用FlatFileItemReader时,我遇到平面文件解析异常

<bean id="masterFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">

        <property name="resource" value="#{stepExecutionContext['fileResource']}" />

        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="lineTokenizer">
                    <bean
                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                        <property name="delimiter" value="${file.delimiter}"/>
                        <property name="names" value="filed1,field2,...field39" />
                    </bean>
                </property>
                <property name="fieldSetMapper">
                    <bean class="com.batch.SrcMasterFieldSetMapper" />
                </property>
            </bean>
        </property>

    </bean>
实际上,它工作得很好,但对于最近的文件,它的抛出错误

org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 1 in resource=[URL [file:/prod/users/cdi/crh537/Java_All/input/xaaaaa]], input=[16910203315393417SEVAN Q DANG18711 PARK GROVE LNDALLASTX7528751224609645044438000VANVETTE98@YAHOO.COM586404562MAR CL197311192013042504Closed (zero balance DDA)220PUSA]
主要区别在于当前文件记录包含一些特殊字符,如@和()

下一行抛出错误。使用的分隔符是^A(linux)

以下是读卡器配置

<bean id="masterFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">

        <property name="resource" value="#{stepExecutionContext['fileResource']}" />

        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="lineTokenizer">
                    <bean
                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                        <property name="delimiter" value="${file.delimiter}"/>
                        <property name="names" value="filed1,field2,...field39" />
                    </bean>
                </property>
                <property name="fieldSetMapper">
                    <bean class="com.batch.SrcMasterFieldSetMapper" />
                </property>
            </bean>
        </property>

    </bean>

我猜您的文件中有隐藏字符。您可以按照说明验证文件中是否包含字符以及包含哪些字符

这个问题可以帮助您为分隔符选择正确的值。按照建议,您可以尝试传递
“\u0001”
,而不是
^A

更新:

实际错误是在打印整个堆栈跟踪时发生的。org.springframework.batch.item.file.transform.IncorrectTokenCountException:在记录中找到的标记数量不正确:预期39个实际40个


这是因为记录/行中的最后一个字段后跟分隔符和$,而不仅仅是$,所以还有一个额外的标记。

谢谢@Nenad。。我会查看链接并让你知道。顺便说一句,我在我的代码中传递“\u0001”作为定界符。也许你也可以放置整个堆栈跟踪,因为
FlatFileItemReader
正在包装
LineTokenizer
中的异常,它包含可能有助于解决问题的实际错误。可能
LineTokenizer
中的异常包含预期39个令牌但有40个令牌的异常,也许你可以将它添加到你的帖子中,这样当有人发现这些帖子时,他们就可以更容易地知道问题出在哪里了。是的@Nenad。。。当我打印整个堆栈跟踪时,实际错误是org.springframework.batch.item.file.transform.IncorrectTokenCountException:在记录中找到的标记数不正确:预期39实际40。。。。但是FlatFileItemReader包装了那个异常,并给出了一些常见的解析异常。是的,我知道,但对这个问题的未来读者来说,编辑您的答案并添加那个异常可能是个好主意,这只是一个建议。阅读此评论的人不多。你能分享你的完整堆栈跟踪吗?事实上,问题是记录以^A$so结尾,它考虑了一个额外的令牌(预期39,实际40)。。感谢我在代码中遗漏的堆栈跟踪细节。