0

在自定义映射器中,我检查的所有地方,映射都是基于列索引完成的。有没有办法根据列名获取数据?

所以假设我需要读取一个包含 10 列的 .csv 文件,而我只想要五列以下。

<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>

目前我已经创建了一个通用的 PropertiesFieldSetMapper 类,我也将它用于其他工作。

public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {

@Override
public Properties mapFieldSet(FieldSet fieldSet) throws BindException {

    Properties properties = fieldSet.getProperties();

    return properties;
}

}

现在,如果只有 5 列且顺序相同,则上面的代码集可以正常工作。当列增加时,代码失败。为此,我们可以实现自定义映射器。

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;
}

}

在上面的代码中,我已经根据列索引完成了映射。但是,如果列的顺序发生变化,这也会失败。因此,为了使其健壮,我想通过名称而不是列索引来映射它。

有没有办法做到这一点?提前致谢。

4

0 回答 0