CSV 看似簡單 (逗號分隔),實際包含複雜特殊字符處理規則:
"" 轉義手工 BufferedReader.readLine() + split(",") 完全無法正確處理上述情況,產出的資料已是「經處理後」而非原始內容,導致入庫錯誤或資料遺失。
專案原用 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;
}
GBK 或 UTF-8。有人擔心「未處理的特殊字符直接入庫會出錯」。大可不必:
PreparedStatement 參數綁定機制已內建處理特殊字符 (SQL 注入防護、轉義)。ps.setString(i, value) 等綁定參數 API,勿自行拼接 SQL 字串。讀取 CSV 請勿手工解析。JavaCsv 等成熟庫完整實作 RFC 4180,正確處理雙引號、逗號、換行等邊界情況,回傳原始資料陣列,配合參數化查詢入庫,安全、高效、零 Bug。