Spring batch ItemReaders是否可以只传入读取的记录,而不需要线映射器转换为对象

Spring batch ItemReaders是否可以只传入读取的记录,而不需要线映射器转换为对象,spring-batch,Spring Batch,我询问是否可以将ItemReader中读取的整个带分隔符的记录作为一个长字符串传递给ItemProcessors 我遇到了数据不可预测的情况。该文件是管道分隔的,但即使使用管道分隔,使用SpringBatch的ItemReader,单个双引号也会出现解析错误 在一个独立的java应用程序中,我使用Spring的StringUtils类编写了代码。我将完整的分隔记录作为字符串(BufferedReader)读入,然后调用Spring的StringUtils.DelimitedListToStrin

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

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

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

我的独立Java程序是一个彻底的解决方案。我将把它变成一个长期解决方案的春季批量工作。这是一个每月一次的过程,要让SAP用户将垃圾排除在数据字段之外(即胖手指城市),即使不是不可能,也是一项不切实际的任务

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

管道分隔的记录将变成逗号分隔的记录。实际上不需要创建域对象并执行所有字段集映射

如果我用错误的方式处理这个问题,我很高兴能有一些想法

先谢谢你

谢谢, 迈克尔

编辑:


由于您从
ItemReader
s读取、写入
itemrwriter
s以及可选地使用
ItemProcessor
s处理的域对象可以是任何
对象
,它们可以是
字符串
s

因此,简短的回答是肯定的,您应该能够使用
FlatFileItemReader
一次读取一行,将其传递给
SomeItemProcessor
,它用逗号替换管道(并处理现有的逗号),并将转换后的行发送给
FlatFileItemWriter
。Spring批处理包括
LineTokenizer
LineAggregator
类的常见实现,这些类可能会有所帮助

在这个场景中,springbatch将像一个美化的搜索替换工具,具有更理智的故障处理能力。要回答是否应该使用域对象或至少是bean这一更大的问题,请考虑是否要在转换过程中执行其他任务,如验证


另外,我不知道FFItemReader在一个双引号上爆炸,可能想将其作为一个bug归档。

我添加了错误。我将研究LineMapper上Spring提供的实现。我开始了那条路线,但没有立即成功。这个练习是一个原型——我的第一个Spring批处理项目。我甚至尝试编写一个通用方法,在项目处理器中,我可以传入bean,通过反射,清除每个字符串字段中的引号、逗号和双引号。天哪,那太慢了。因此,我正在备份,可能只是在将文件记录发送到ItemWriter之前在循环中删除数组列。在本例中,我正在寻找的答案是PassThroughLineMapper。谢谢,@Emerson。我浏览了Spring批处理代码,看到了“在DelimitedLineTokenizer中用作转义字符。它基本上允许分隔符出现在字段中,这很可能是不正确的令牌计数和异常的原因。尝试调用setQuoteCharacter并将quote字符设置为其他字符。
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