首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 讀取 CSV 實戰:拋棄手工 IO,拥抱 JavaCsv 庫正確處理特殊字符

     編輯:Java 相關知識

痛點:手工 IO 讀取 CSV 的陷阱

CSV 看似簡單 (逗號分隔),實際包含複雜特殊字符處理規則:

  • 含特殊字符 (逗號、換行、雙引號) 的欄位需用雙引號包裹
  • 欄位內的雙引號需以雙雙引號 "" 轉義
  • 其他 RFC 4180 規範細節

手工 BufferedReader.readLine() + split(",") 完全無法正確處理上述情況,產出的資料已是「經處理後」而非原始內容,導致入庫錯誤或資料遺失。

解決方案:JavaCsv 庫

專案原用 POI 處理 Excel,但 POI 不支援 CSV。引入 JavaCsv (javacsv.sf.net) 專業解析庫,幾行代碼搞定。

完整實作代碼


public List<String[]> importCsv(String file) {
    List<String[]> list = new ArrayList<String[]>();
    CsvReader reader = null;
    try {
        // 1. 初始化:指定分隔符 ',' 與編碼 GBK (視檔案實際編碼而定)
        reader = new CsvReader(file, ',', Charset.forName("GBK"));
        
        // 2. 逐行讀取,每行回傳 String[] (順序 = 欄位順序)
        while (reader.readRecord()) {
            String[] values = reader.getValues();
            if (values != null && values.length > 0 
                && values[0] != null && !"".equals(values[0].trim())) {
                list.add(values);  // 取得原始未處理資料
            }
        }
    } catch (FileNotFoundException e) {
        log.error("CSV file not found", e);
    } catch (IOException e) {
        log.error("CSV read error", e);
    } finally {
        if (reader != null) reader.close();  // 3. 必須關閉釋放資源
    }
    return list;
}

三大關鍵點

  1. 指定編碼:預設 ISO-8859-1,中文環境常需 GBK 或 UTF-8。
  2. getValues() 回傳原始陣列:未經特殊字符轉義處理,正是我們想要的「乾淨資料」。
  3. finally 關閉 reader:避免檔案鎖定洩漏。

關於特殊字符入庫的迷思

有人擔心「未處理的特殊字符直接入庫會出錯」。大可不必:

  • JDBC PreparedStatement 參數綁定機制已內建處理特殊字符 (SQL 注入防護、轉義)。
  • 主流持久層框架 (Hibernate, MyBatis, JPA) 底層皆封裝 JDBC,同樣安全。
  • 只需使用 ps.setString(i, value) 等綁定參數 API,勿自行拼接 SQL 字串。

結語

讀取 CSV 請勿手工解析。JavaCsv 等成熟庫完整實作 RFC 4180,正確處理雙引號、逗號、換行等邊界情況,回傳原始資料陣列,配合參數化查詢入庫,安全、高效、零 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved