私は以下のようなアイテムリーダーを持っています:
<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>
上記から明らかなように、引用文字をデフォルトの " (二重引用符) から ~ (傾斜記号) に変更しています。
ここで、引用文字の DelimitedLineTokenizer の Java Docs は次のように述べています。
quoteCharacter のパブリック セッター。引用符を使用して、フィールドを行末に拡張したり、区切り文字を含む文字列を囲んだりできます。引用符で囲まれたトークン内では、引用符文字を使用してそれ自体をエスケープできます。したがって、"a""b""c" は a"b"c にトークン化されます。
したがって、データ自体に区切り文字 (私の場合はパイプ記号) が含まれている場合は、それを引用符で囲む必要があります。たとえば、3 番目の列に区切り文字が含まれている場所の下の行:
oneColumn|twoColumn|three~|~Column|fourColumn
ただし、列 3 の Java オブジェクト内にある値は、本来あるべき「three|Column」ではなく、「three~|~Column」です。
データ内の区切り文字をエスケープするために使用される引用符は、結果の Java オブジェクト項目のプロパティ内に値を設定する際に自動的に処理および無視されるべきではありませんか?
これに対する唯一の解決策は、ライター (PreparedStatementSetter または LineAggregator) で引用符文字を空の文字列に再度置き換えることですか?
読んでくれてありがとう!