java 阅读CSV中的换行符,这些换行符在spring批处理的FlatfileItemReader中的文件中引用

o4tp2gmn  于 2022-12-02  发布在  Java
关注(0)|答案(3)|浏览(289)

我正在尝试用FlatFileItemReader解析一个CSV文件。此CSV文件包含一些带引号的换行符,如下所示。

email, name
abc@z.com, "NEW NAME
 ABC"

但此解析失败,必填字段为2,而实际字段为1。
我在FlatFileReader配置中缺少什么?

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

                <!-- The lineTokenizer divides individual lines up into units of work -->
                <property name="lineTokenizer">
                    <bean
                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

                        <!-- Names of the CSV columns -->
                        <property name="names"
                            value="email,name" />
                    </bean>
                </property>

                <!-- The fieldSetMapper maps a line in the file to a Product object -->
                <property name="fieldSetMapper">
                    <bean
                        class="com.abc.testme.batchjobs.util.CustomerFieldSetMapper" />
                </property>
            </bean>
        </property>
gv8xihay

gv8xihay1#

FlatFileItemReader使用SimpleRecordSeparatorPolicy作为开箱即用,适合您的使用情况

  • 注解部分超过2行或更多行

您需要设置DefaultRecordSeparatorPolicy
引自其javadoc:
一个RecordSeparatorPolicy,它将所有行视为记录结尾,只要它们没有未终止的引号,并且不以接续标记结尾。
示例XML配置

<bean id="reader" 
      class="org.springframework.batch.item.file.FlatFileItemReader">
      ...
    <property name="recordSeparatorPolicy">
        <bean class="org.springframework.batch.item.file.separator.DefaultRecordSeparatorPolicy" />
    </property>
      ...
</bean>
roejwanj

roejwanj2#

itemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
niknxzdl

niknxzdl3#

用于阅读带有带引号的换行符的csv文件的完整Bean配置

@Bean
public FlatFileItemReader<Object> flatFileItemReader() {

    FlatFileItemReader<Object> reader = new FlatFileItemReader<>();
    reader.setResource(new FileSystemResource("resource.csv"));
    
    // Add this line to your code
    reader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
   
    return reader;
}

相关问题