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
相关产品推荐
相关产品推荐

