2013-08-01 1 views
0

У меня есть читателя пункт, как показано ниже:Spring Batch DelimitedLineTokenizer класс quoteCharacter поведение свойство

<beans:bean id="myItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 
<beans:property name="resource" ref="myFileResource" /> 
    <beans:property name="lineMapper"> 
     <beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <beans:property name="lineTokenizer"> 
       <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        <beans:property name="delimiter" value="|"/> 
        <beans:property name="quoteCharacter" value="~"/> 
        <beans:property name="names" value="${my_column_names}" /> 
       </beans:bean> 
      </beans:property> 
      <beans:property name="fieldSetMapper"> 
      <beans:bean class="${my_mapper_class_name}" /> 
     </beans:property> 
    </beans:bean> 
</beans:property> 

Как видно из выше, я изменяю кавычку из умолчанию "(двойные кавычки) в ~ (наклона знак)

Теперь, Java Docs на DelimitedLineTokenizer на кавычка говорит:

Public сеттер для Qu oteCharacter. Символ кавычки может использоваться для расширения поля в конце строки или для включения строки, содержащей разделитель. Внутри котируемого токена символ кавычки может использоваться для выхода из себя, поэтому «a» «b» «c» обозначается буквой «b» c.

Таким образом, если мои данные содержат разделитель (знак трубы в моем случае), тогда я должен окружить его символом кавычки - что я и сделал. Например. строка ниже, где третий столбец содержит разделитель:

oneColumn|twoColumn|three~|~Column|fourColumn 

Однако значение, которое приходит в моем объекте Java для третьей колонки есть «три ~ | ~ Column», а не «три | Колонок», как это должно быть.

Не следует ли автоматически вводить и игнорировать символ кавычки, используемый для исключения разделителя в данных, при установке значения внутри свойства результирующего объекта объекта java?

Является заменой символа кавычки пустой строкой в ​​записи (PreparedStatementSetter или LineAggregator) единственным решением для этого?

Спасибо за чтение!

ответ

0

Строка предназначена для цитирования, если она начинается/заканчивается кавычкой char. В вашем примере:

oneColumn|twoColumn|~three|Column~|fourColumn 

и вы получите three|Column Вы должны процитировать строку, если она содержит разделитель, пробел, символ новой строки или сам квотирование символ; котировка char должна быть удвоена, если часть значения (см. here)