【问题标题】:FlatFileParseException Spring batchFlatFileParseException 春季批处理
【发布时间】:2015-05-13 03:18:07
【问题描述】:

当我在作业配置中使用 FlatFileItemReader 时出现平面文件解析异常。

实际上它工作正常,但最近的文件抛出错误。

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)

16^A123^A2323232^ADD^SWAN D REE^A123 MMM STRRET^A^ADALLAS^ATX^A2222^A^A^A^A^A^A^A^A^A^A434343434^A23232^A^AABC@ABC.COM^A586404562^A^A^AMAR^A ^ACL^A121212^A20130425^A04^AClose^A^A220^A^A^AP^AUSA^A

以下是阅读器配置。

<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>

【问题讨论】:

  • 你能分享你的完整堆栈跟踪吗?
  • 实际上问题是以 ^A$ 结尾的记录,因此,它考虑了一个额外的令牌(预期 39,实际 40)。感谢我在代码中以某种方式错过的详细堆栈跟踪。

标签: spring-batch filereader


【解决方案1】:

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

这个问题可以帮助您\001 delimiter issues 为分隔符选择正确的值。按照建议,您可以尝试通过"\u0001" 而不是^A

更新:

实际错误是在打印整个堆栈跟踪时 org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 39 actual 40

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

【讨论】:

  • 谢谢@Nenad.. 我会查看链接并告诉你。顺便说一句,我在我的代码中将“\u0001”作为分隔符传递。
  • 也许您也可以放置整个堆栈跟踪,因为 FlatFileItemReader 正在包装来自 LineTokenizer 的异常,并且它包含可能有助于解决问题的实际错误。
  • 可能来自LineTokenizer 的异常持有异常,它需要 39 个令牌但有 40 个,也许您可​​以将其添加到您的帖子中,这样当有人找到此帖子时,他们会更容易知道哪里出了问题。
  • 是@Nenad ...当我打印整个堆栈跟踪时,实际错误是 org.springframework.batch.item.file.transform.IncorrectTokenCountException:在记录中找到的令牌数量不正确:预期 39 实际40 .... 但是 FlatFileItemReader 包装了该异常并给出了一些常见的解析异常。
  • 是的,我知道,但可能有利于该问题的未来读者编辑您的答案并添加该例外,这只是建议。没有多少人读过这个 cmets。
猜你喜欢
  • 2014-12-15
  • 2018-05-27
  • 2017-06-25
  • 2017-10-06
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多