使用Apache Commons CSV读取CSV文件失败——IllegalArgumentException
排查Apache Commons CSV读取eBay MIP CSV文件的索引错误
我之前处理eBay相关CSV的时候也踩过类似的坑,给你几个大概率能解决问题的排查方向:
1. 确认CSV分隔符是否匹配
eBay导出的CSV有时候会用**制表符(\t)**作为分隔符,而Apache Commons CSV的CSVFormat.DEFAULT默认是用逗号分隔的。如果你的代码里没指定正确的分隔符,就会把整行当成一个字段,自然找不到对应的索引。
解决方法:
- 如果是制表分隔,直接用
CSVFormat.TDF:CSVParser parser = CSVParser.parse(new File("your-file.csv"), StandardCharsets.UTF_8, CSVFormat.TDF.withHeader()); - 不确定的话,可以先打印出解析后的字段数,看看是否和表头数量一致:
for (CSVRecord record : parser) { System.out.println("字段数:" + record.size()); }
2. 处理UTF-8 BOM问题
eBay下载的CSV经常会带UTF-8 BOM(字节顺序标记),这会导致解析出来的第一个表头前面多了个隐藏字符,比如原本的"ItemID"会变成"\uFEFFItemID",自然匹配不上你指定的索引。
解决方法:
- 使用Apache Commons IO的
BOMInputStream来跳过BOM:try (InputStream is = new FileInputStream("your-file.csv"); BOMInputStream bomIs = new BOMInputStream(is); Reader reader = new InputStreamReader(bomIs, StandardCharsets.UTF_8); CSVParser parser = CSVParser.parse(reader, CSVFormat.DEFAULT.withHeader())) { // 处理记录 } - 或者手动检查并跳过BOM字符。
3. 核对表头的精确匹配
有时候看起来一致的表头,可能存在大小写差异、前后空格、特殊字符(比如全角空格、下划线/空格的区别)。比如文件里是"Item ID",但你代码里用的是"ItemID",或者表头末尾有空格,都会导致索引找不到。
解决方法:
- 先打印出所有解析到的表头,看看实际是什么:
CSVParser parser = CSVParser.parse(new File("your-file.csv"), StandardCharsets.UTF_8, CSVFormat.DEFAULT.withHeader()); System.out.println("实际表头:" + parser.getHeaderMap().keySet()); - 确保代码里使用的表头名称和打印出来的完全一致,包括大小写和空格。
4. 检查文件的换行符和异常格式
如果CSV文件里存在未被引号包裹的换行符(比如商品描述里的换行),或者使用了非标准的换行符(比如Mac的\r),可能会导致Apache Commons CSV解析时把一行拆成多行,表头和内容对应不上。
解决方法:
- 用文本编辑器(比如Notepad++)打开CSV文件,查看显示所有字符(Notepad++里是“视图->显示符号->显示所有字符”),检查换行符是否正常,单元格里的换行是否被双引号包裹。
- 解析时可以设置
withIgnoreSurroundingSpaces()和withTrim()来忽略字段前后的空格:CSVFormat format = CSVFormat.DEFAULT.withHeader().withIgnoreSurroundingSpaces().withTrim();
内容的提问来源于stack exchange,提问作者S.O.S
相关产品推荐
相关产品推荐

