Я спрашиваю, могу ли я передать в 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
Я добавил ошибку. Я рассмотрю Spring, предоставленные реализацией на LineMapper. Я начал этот маршрут, но не сразу добился успеха. Это упражнение - прототип рода - мой первый проект Spring Batch. Я даже попытался написать общий общий метод, в котором в обработчике элементов я мог бы передать в bean-компоненте и с отражением скрабы каждое поле String для кавычек, запятых и двойных кавычек. Мальчик, это было ужасно медленно.Итак, я поддерживаю, возможно, просто беря запись файла и очищая столбцы массива в цикле перед отправкой его в ItemWriter. – Davidson
PassThroughLineMapper - это ответ, который я ищу, в данном случае. Спасибо, @ Эмерсон. – Davidson
Я просмотрел код весны Batch и увидел, что «используется в качестве escape-символа в DelimitedLineTokenizer. В основном это позволяет разграничителю появляться в поле, что, скорее всего, является причиной неправильного количества токенов и исключения. setQuoteCharacter и установить символ кавычки на что-то еще. –