如何用Java OpenCSV正确读取制表符分隔的CSV文件?
如何用OpenCSV正确读取制表符分隔的CSV文件
问题根源
你的代码出现错误输出的核心问题有三个:
- 错误指定分隔符:用空格
' '代替了文件实际的制表符'\t',导致OpenCSV把每个空格都当成分隔符,拆分了带空格的字段(比如车型名) - 跳过行数不正确:文件前两行是公司名称和时间范围,不属于数据行,应该跳过2行而非1行
- 字段位置计数错误:
@CsvBindByPosition的position从0开始计数,你之前的position值对应列位错误
修正后的代码实现
1. 实体类定义(修正位置绑定)
import lombok.Getter; import lombok.Setter; import com.opencsv.bean.CsvBindByPosition; @Getter @Setter public class CsvLine { // Product列是第0位(从0开始计数) @CsvBindByPosition(position = 0) private String model; // Country列是第1位 @CsvBindByPosition(position = 1) private String country; }
2. CSV读取代码(修正分隔符和跳过行数)
import com.opencsv.bean.CsvToBeanBuilder; import java.io.FileReader; import java.util.List; public class CsvReader { public static void main(String[] args) { String fileName = "C:\\in_progress\\zzz.csv"; try { List<CsvLine> beans = new CsvToBeanBuilder(new FileReader(fileName)) .withType(CsvLine.class) .withSeparator('\t') // 改为制表符分隔 .withSkipLines(2) // 跳过前两行无关内容 .build() .parse(); for (CsvLine item : beans) { System.out.printf("车型:%s,国家:%s%n", item.getModel(), item.getCountry()); } } catch (Exception e) { e.printStackTrace(); } } }
关键修正说明
- 分隔符修正:将
withSeparator(' ')替换为withSeparator('\t'),匹配文件实际的制表符分隔规则,避免拆分带空格的字段 - 跳过行数调整:文件前两行是
Company ABC和时间范围,不属于数据行,因此设置withSkipLines(2)跳过这两行,直接读取表头和数据 - 字段位置修正:OpenCSV的
@CsvBindByPosition从0开始计数,Product列是第一列(索引0),Country是第二列(索引1),修正后可正确映射字段
预期输出
车型:Nissan Maxima,国家:USA 车型:BMW X7 M50i,国家:USA 车型:Volvo XC90,国家:USA 车型:Opel Insignia,国家:USA 车型:Renult Triber,国家:USA 车型:Toyota Yaris,国家:USA 车型:Ford Mondeo,国家:USA
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

