2012-01-21 4 views
1

У меня есть программа весенней партии, в которой я пишу из базы данных в файл фиксированного формата.База данных весной партии в файл с фиксированным файлом - проблема с выходом в файл

Таблица моей базы данных состоит из 5 столбцов. Все столбцы содержат описание некоторых продуктов. Колонка имеет тип varchar с каждым размером 200.

Я читаю описания из столбцов в моем pojo как 5 свойств строки, а именно: desc1, desc2, desc3, desc4, desc5.

Мой деталь писатель выглядит следующим образом:

<beans:bean id="DbToFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> 
    <beans:property name="resource" value="file:c:\TestData\output.dat" /> 

    <beans:property name="lineAggregator"> 
     <beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator"> 
      <beans:property name="fieldExtractor"> 
       <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> 
       <beans:property name="names" value="desc1, desc2, desc3, desc4, desc5" /> 
       </beans:bean> 
      </beans:property> 

      <beans:property name="format" value="%-20s%-30s%-30s%-30s%-30s" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

Как показано Я хочу DESC1 быть в фиксированном поле длины 20 символов и DESC2 через desc4 в фиксированной длины поля 30 символов каждый в файл.

Однако проблема заключается в том, что я получаю всю строку desc независимо от ее размера. То есть, если desc1 содержит 40 символов из базы данных, он также будет содержать 40 символов в файле.

Я чувствую, что он должен принимать только первые 20 символов и игнорировать остальные.

В чем проблема? Это ошибка, или я делаю что-то неправильно?

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

ответ

3

FormatterLineAggregator использует String.format() под капотом, так что вы можете использовать правую Formatter syntax (*), чтобы получить то, что вы хотите

два примера, чтобы показать, что вы пропустили в вашем синтаксисе форматировочной

неправильно:

// formatted to print out 5 characters minimum 
    String wrong = String.format("%-5s", new Object[]{"1234567890"}); 
    System.out.println(wrong); 
    // prints: 1234567890 

правильно:

// formatted to print out 5 characters minimum AND 6 characters maximum 
    String correct = String.format("%-5.6s", new Object[]{"1234567890"}); 
    System.out.println(correct); 
    // prints: 123456 

(*) это упоминается также в javadoc FormatterLineAggregator

+0

Я думаю, что я где-то читал, что% 5s означает, что строка 5 помещается в поле с 5 символами с правильным дополнением, а% -5s означает то же самое с левым дополнением. однако, ваш ответ правильный ... – Nik

+0

Что я хочу, чтобы столбец был точным 10 символов, независимо от того, является ли строка <10 символов, равно 10 символам или> 10 символов ... я должен поставить% -10.10 в дело ??? – Nik

+0

это будет% -10.10s, см. Formatter Javadoc :-) –

1

Простейшим решением будет изменение вашего читателя, например. Ваш может создать представление SQL над столом или написать собственный SQL запрос типа:

select substr(desc1,1,20), substr(desc2,1,20), ... from my_table 

В качестве альтернативы вы можете написать собственную реализацию FieldExtractor интерфейса, который должен агрегировать BeanWrapperFieldExtractor. После вызова BeanWrapperFieldExtractor#extract() он должен обрезать все значения с заданным максимальным размером.