0

我在问是否可以将在 ItemReader 中读取的整个分隔记录作为一个长字符串传递给 ItemProcessors。

我遇到了数据不可预测的情况。该文件是用管道分隔的,但即使这样,使用 Spring Batch 的 ItemReader 时,单个双引号也会出现解析错误。

在一个独立的 Java 应用程序中,我使用 Spring 的 StringUtils 类编写了代码。我将完整的分隔记录读取为字符串(BufferedReader),然后调用 Spring 的 StringUtils.delimitedListToStringArray(...,...)。这将获取所有字符(无论是否有效),然后我可以进行搜索/替换以获取字段中的任何单个双引号或逗号之类的内容。

我的独立 Java 程序是一个糟糕的解决方案。我正在把它变成一个 Spring Batch 的长期解决方案。这是一个每月一次的过程,如果不是不可能的话,让 SAP 用户将垃圾排除在数据字段之外是一项不切实际的任务(即胖手指城市)。

我看到我必须有一个域对象才能将输入记录映射到其中。这是正确的,还是我可以做一个传递场景,让我自己使用 StringUtils 处理解析?

管道分隔的记录变成逗号分隔的记录。确实没有必要创建域对象并进行所有字段集映射。

如果我以错误的方式接近这个想法,我会很高兴。

先感谢您。

谢谢,迈克尔

编辑:

This is the error, and the record.  The lone double-quote in column 6 is the problem.  I can't control the input, so I'm scrubbing each field (all Strings) for unwanted characters.  So, my solution was to skip the line mapping and use StringUtils to do it myself--as I've done as mentioned earlier.

Caused by: org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 33526 in resource=[URL [file:/temp/comptroller/myfile.txt]], input=[xxx|xxx|xxx|xxx|xxx|xxx x xxx xxxxxxx xxxx xxxx "x|xxx|xxx|xxxxx|xx|xxxxxxxxxxxxx|xxxxxxx|xxx|xx |xxx ]
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:182)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:85)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90)
    at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87)
    ... 27 more
Caused by: org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 15 actual 6
4

1 回答 1

0

由于您从ItemReaders 读取、写入到ItemWriters 以及使用 s 进行可选处理的域对象ItemProcessor可以是 any Object,因此它们可以是Strings。

所以简短的回答是肯定的,您应该能够使用 a 一次FlatFileItemReader读取一行,将其传递给SomeItemProcessor<String,String>,它用您想要的任何代码用逗号替换您的管道(并处理现有的逗号),并将这些转换后的行发送到一个FlatFileItemWriterLineTokenizerSpring Batch 包括可以提供帮助的和LineAggregator类的常见实现。

在这种情况下,Spring Batch 就像一个美化的搜索替换工具,具有更明智的故障处理。要回答是否应该使用域对象或至少是 bean 的更大问题,请考虑是否要在转换过程中执行其他任务,例如验证。

PS 我不知道 FFItemReader 在单个双引号上爆炸,可能想将其归档为错误。

于 2013-06-23T21:26:46.133 回答