In the Custom Mapper, everywhere I checked, the mapping is done on basis of column index. Is there a way we can get the data on basis of column names?
So suppose I need to read a .csv file with 10 columns and I want only below five columns.
<bean id="ReportReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="linesToSkip" value="1" />
<property name="resource" value="classpath:rawdata/file.csv" />
<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="strict" value="False" />
<property name="names">
<array>
<value>columnName1</value>
<value>columnName2</value>
<value>columnName3</value>
<value>columnName4</value>
<value>columnName5</value>
</array>
</property>
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.PropertiesFieldSetMapper">
</bean>
</property>
</bean>
</property>
</bean>
Currently I have created a generic PropertiesFieldSetMapper class which I use for other jobs too.
public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {
@Override
public Properties mapFieldSet(FieldSet fieldSet) throws BindException {
Properties properties = fieldSet.getProperties();
return properties;
}
}
Now above set of code works fine if there are only 5 columns and in same order. When the column increases the code fails. For that we can implement Custom Mapper.
public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {
@Override
public Properties mapFieldSet(FieldSet fieldSet) throws BindException {
//Properties properties = fieldSet.getProperties();
Properties properties = new Properties();
properties.setProperty("columnName1", fieldSet.readString(0));
properties.setProperty("columnName2", fieldSet.readString(1));
properties.setProperty("columnName3", fieldSet.readString(2));
properties.setProperty("columnName4", fieldSet.readString(3));
properties.setProperty("columnName5", fieldSet.readString(4));
return properties;
}
}
In above code I have done the mapping on basis of column index. But this too fails if the order of the columns changes. Thus to make it robust, I want to map it via names and not column index.
Is there a way to achieve this?? Thanks in advance.