FlatFileItemReaderで読み込んだデータをMapや配列にマップする部品

FlatFileItemReaderでは読み込んだデータをPOJOに設定することができます。

しかし、データをMapや配列に設定する機能は持っていません。

一時的なデータを作成するためにPOJOをいちいち作成するのはなかなか面倒です。

こんなときはMapにデータを設定できると便利です。

ArrayFieldSetMapperやMapFieldSetMapperは、配列やMapに設定する部品です。

以下では、具体的に利用方法を見ていきます。

【参考:javadoc】

ArrayFieldSetMapper

MapFieldSetMapper

目標

まず、以下のサンプルの目標(ゴール)を示します。

ファイルからデータを取得し、Mapに設定することを目標にします。

ですのでitemはMapになります。

ItemProcessorやItemWriterでは、Mapが渡ることになります。

使用サンプル

<バッチ処理設定ファイル(一部抜粋): job-context.xml>

<!-- ジョブの処理1 -->

<job id="job1" xmlns="http://www.springframework.org/schema/batch" incrementer="jobParametersIncrementer">

<step id="step1" parent="simpleStep" >

<tasklet>

<chunk reader="fileItemReader" writer="itemWriter" commit-interval="100" />

</tasklet>

</step>

</job>

<!-- enables the functionality of JobOperator.startNextInstance(jobName) -->

<bean id="jobParametersIncrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer" />

<bean id="simpleStep" class="org.springframework.batch.core.step.item.SimpleStepFactoryBean" abstract="true">

<property name="jobRepository" ref="jobRepository" />

<property name="commitInterval" value="1" />

</bean>

<!--ファイルを読み込みMapに入れる -->

<bean id="fileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">

<property name="resource" value="classpath:/test/mapFieldSetMapperTest.txt" />

<property name="encoding" value="shift_jis" />

<property name="lineMapper">

<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">

<property name="lineTokenizer">

<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

<property name="names" value="id,name,date,dec" />

</bean>

</property>

<property name="fieldSetMapper">

<bean class="jp.co.soracane.batch.item.file.MapFieldSetMapper" >

<property name="typeNames" value="Int,String,Date:yyyy/MM/dd,BigDecimal" />

</bean>

</property>

</bean>

</property>

</bean>

MapFieldSetMapperは、フィールドをHashMapに変換するマッパーです。

typeNamesプロパティにて型を指定していますが、順番はデータファイルのフィールドの順番と同じです。

また、書式を指定できる型については:(コロン)の後に指定できます。

上記ではDate型について書式を指定しています。

ArrayFieldSetMapperについても使い方は同じで、itemが配列になるという違いがあるだけです。

上記サンプルではitemWriterのサンプルは記述していませんので、各自で自由に設定してみてください。

<データファイルサンプル: /test/mapFieldSetMapperTest.txt>

1,太郎,2010/05/05,123.1234

2,次郎,2010/07/07,12

3,さんま,2010/08/08,100.0001

4,タモリ,2010/09/09,21

5,鶴野,2010/10/10,21345678

例えば1行目のデータを読み込むと、itemとして以下のようなMapを作ります。

map["id"] = 1 (Integer型)

map["name"] = "太郎" (String型)

map["date"] = 2010/05/05 (Date型)

map["dec"] = 123.1234 (BigDecimal型)

最後に

Mapと配列をitemにマップできるようになったことで、Springの設定ファイルに記述するだけで可能になることが増えたかと思います。

Mapをファイル用のItemWriterで書き出したい場合は、MapFieldExtractorを使用してみてください。

詳しくはjavadocをご覧ください。

Created Date: 2010/01/10