我在问是否可以将在 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