2013-06-23 1 views
0

Я спрашиваю, могу ли я передать в ItemProcessors всю запись с разделителями, прочитанную в ItemReader, как одну длинную строку.Может ли ItemReaders просто пройти в записи, прочитав и не нуждаясь в строкеMapper t o конвертировать в объект

У меня есть ситуации с непредсказуемыми данными. Файл разделен на трубы, но даже при этом одна двойная кавычка будет иметь ошибку синтаксического анализа, используя ItemReader Spring Batch.

В автономном приложении Java я написал код, используя класс Spring StringUtils. Я читал в полной разделительной записи как String (BufferedReader), а затем вызывал Spring StringUtils.delimitedListToStringArray (..., ...). Это приводит к тому, что все символы действительны или нет, а затем я могу выполнить поиск/замену, чтобы получить такие вещи, как любая двойная кавычка или запятая в полях.

Моя автономная программа Java - это решение n-dirty. Я превращаю его в Spring Batch для долгосрочного решения. Это ежемесячный процесс, и задача непрактичного, если не невозможного, заставить пользователей SAP сохранять мусор из полей данных (т. Е. Города с жирными пальцами).

Я вижу, где он появляется, у меня должен быть объект домена для ввода входной записи. Правильно ли это, или я могу выполнить сквозной сценарий, и позвольте мне обработать разбор себя с помощью StringUtils?

Записи, разделенные трубой, превращаются в записи с разделителями-запятыми. Нет необходимости создавать объект домена и делать все сопоставление набора полей.

Я рад за идеи, если я приближаюсь к этому неправильно.

Заранее спасибо.

Спасибо, Майкл

EDIT:

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 

ответ

0

Поскольку домен объекты вы читаете из ItemReader с, напишите ItemWriter с, и, возможно, процесс с ItemProcessor с может быть любой Object, они могут быть String s.

Так короткий ответ да, то вы должны быть в состоянии использовать FlatFileItemReader прочитать одну строку в то время, передать его SomeItemProcessor<String,String>, который заменяет ваши трубы запятыми (и обрабатывает существующие запятые) с тем, что код, который вы хотите, и отправляет эти преобразованные строки в FlatFileItemWriter. Spring Batch включает в себя общие реализации классов LineTokenizer и LineAggregator, которые могут помочь.

В этом случае Spring Batch будет действовать как инструмент прославленного поискового замещения с более надежной обработкой отказа. Чтобы ответить на более широкий вопрос о том, следует ли использовать объекты домена или, по крайней мере, компоненты, подумать о том, хотите ли вы выполнять другие задачи в процессе преобразования, например, проверку.

P.S. Я не знаю, что FFItemReader взорвется на одну двойную кавычку, возможно, захочет записать это как ошибку.

+0

Я добавил ошибку. Я рассмотрю Spring, предоставленные реализацией на LineMapper. Я начал этот маршрут, но не сразу добился успеха. Это упражнение - прототип рода - мой первый проект Spring Batch. Я даже попытался написать общий общий метод, в котором в обработчике элементов я мог бы передать в bean-компоненте и с отражением скрабы каждое поле String для кавычек, запятых и двойных кавычек. Мальчик, это было ужасно медленно.Итак, я поддерживаю, возможно, просто беря запись файла и очищая столбцы массива в цикле перед отправкой его в ItemWriter. – Davidson

+0

PassThroughLineMapper - это ответ, который я ищу, в данном случае. Спасибо, @ Эмерсон. – Davidson

+0

Я просмотрел код весны Batch и увидел, что «используется в качестве escape-символа в DelimitedLineTokenizer. В основном это позволяет разграничителю появляться в поле, что, скорее всего, является причиной неправильного количества токенов и исключения. setQuoteCharacter и установить символ кавычки на что-то еще. –