Java采用opencsv解析csv文件以及解析中文亂碼問題

參考資料: opencsv文檔
寫下本文時最新版的opencsv版本為4.0, maven坐標如下:

    <dependency>
      <groupId>com.opencsv</groupId>
      <artifactId>opencsv</artifactId>
      <version>4.0</version>
    </dependency>

測試用test.csv

id,date,name
1,2017-10-11,amy
2,2017-10-12,啊

與csv文件對應的java bean

public class TestBean {
    // 通過屬性名綁定csv列名, 屬性名必須與csv列名相同
    @CsvBindByName
    private Integer id;

    // 解析Date格式
    @CsvBindByName
    @CsvDate("yyyy-MM-dd")
    private Date date;

    // csv列名與字段名不同時
    @CsvBindByName(column = "name")
    private String name;

    // csv不存在列名時也可通過位置綁定, 如 `@CsvBindByPosition(position = 0)   `

    // getter, setter and toString() ...
}

使用opencsv解析

public class CsvParser {
    public static void main(String[] args) throws IOException {
        String path = "test.csv";
        List<TestBean> beans = new CsvToBeanBuilder<TestBean>(new FileReader(path))
            .withType(TestBean.class).build().parse();
        System.out.println(beans);
    }
}

結果中中文顯示亂碼

[TestBean [id=1, date=Wed Oct 11 00:00:00 CST 2017, name=amy], 
TestBean [id=2, date=Thu Oct 12 00:00:00 CST 2017, name=??]]

由于FileReader無法指定字符編碼, 此時應當使用InputStreamReader設置字符編碼

public class CsvParser {
    public static void main(String[] args) throws IllegalStateException, IOException {
        String path = "test.csv";
        String charset = "utf-8";
        FileInputStream fileInputStream = new FileInputStream(path);
        Reader reader = new InputStreamReader(fileInputStream, charset);
        List<TestBean> beans = new CsvToBeanBuilder<TestBean>(reader)
            .withType(TestBean.class).build().parse();
        System.out.println(beans);
    }
}

從結果來看, 中文解析以及正常了

[TestBean [id=1, date=Wed Oct 11 00:00:00 CST 2017, name=amy], 
TestBean [id=2, date=Thu Oct 12 00:00:00 CST 2017, name=啊]]

實際上csv列名為中文時, 只要在bean中對應屬性配置了@CsvBindByName(column = "中文列名")也是可以解析的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容