You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Batch读取UNL文件时保留特殊字符的方案咨询

Spring Batch FlatFileItemReader 读取含特殊字符UNL文件的问题解决

问题根源

你代码里多次调用quoteCharacter()方法,每次调用都会覆盖之前的配置,最终生效的是DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER(即双引号")。当数据字段中本身包含双引号时,解析器会把它当成引号边界处理,导致分隔符|的解析逻辑混乱,进而出现分隔失效、特殊字符无法原样保留的问题。

解决方案

要原样导入"、@及空格等特殊字符,核心是避免解析器把数据中的字符误认为引号标记,同时保留字段的原始内容:

方案1:配置不存在于数据中的引号字符

设置一个在你的UNL文件数据里绝对不会出现的字符作为quoteCharacter,比如空字符\u0000,这样解析器就不会触发引号解析逻辑,所有字符都会被原样保留:

@Bean
@StepScope
public FlatFileItemReader unlFileReader() throws MalformedURLException {
    return new FlatFileItemReaderBuilder<ExampleDTO>()
        .name("unlFileReader")
        .resource(fileService.inputFileResource(UNZIP_PATH + "example.unl"))
        .fieldSetMapper(new BeanWrapperFieldSetMapper<>())
        .targetType(ExampleDTO.class)
        .delimited()
        .delimiter("|")
        // 使用空字符作为引号标记,确保不会与数据中的字符冲突
        .quoteCharacter('\u0000')
        // 关闭自动忽略字段前后空格,保留原始空格
        .ignoreLeadingWhiteSpace(false)
        .includedFields(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141)
        .names(ExampleDTO.getFieldNameArrays())
        .build();
}

方案2:完全禁用引号解析

如果你的数据中根本不需要引号包裹字段的逻辑,可以直接不调用quoteCharacter(),但这种方式存在隐患:若数据中的双引号没有成对出现,仍会导致解析错误。因此更推荐方案1,明确设置无冲突的引号字符。

补充说明

  • ignoreLeadingWhiteSpace(false):确保字段前后的空格被原样保留,比如你示例中001-A472468827" 后面的空格不会被自动去除。
  • 如果数据中存在需要作为字段内容的分隔符|,则需要确保这些字段被正确用引号包裹;若你的场景无此需求,方案1即可满足要求。

内容的提问来源于stack exchange,提问作者Josso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:50:33