CSV (Comma-Separated Values) 是最通用的表格資料交換格式。雖然有 OpenCSV、Apache Commons CSV 等成熟函式庫,但理解使用 JDK 原生 IO 流處理 CSV 的基本模式,有助於處理簡單場景或除錯第三方函式庫行為。
import java.io.*;
import java.nio.charset.StandardCharsets;
public class CsvDemo {
public static void main(String[] args) {
File inputFile = new File("D:/data/input.csv");
File outputFile = new File("D:/data/output.csv");
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(inputFile), StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(outputFile), StandardCharsets.UTF_8))) {
String line;
boolean isHeader = true;
while ((line = reader.readLine()) != null) {
// 簡單分割(不處理欄位內含逗號/換行的情況)
String[] fields = line.split(",");
// === 業務邏輯處理區 ===
// 範例:過濾特定欄位、資料轉換、驗證等
// String processed = process(fields);
// ======================
// 寫入新檔案(這裡示範單純複製)
writer.write(String.join(",", fields));
writer.newLine();
if (isHeader) {
System.out.println("表頭: " + line);
isHeader = false;
}
}
System.out.println("CSV 處理完成");
} catch (IOException e) {
System.err.println("檔案處理失敗: " + e.getMessage());
e.printStackTrace();
}
}
}
| 類別 | 用途 | 注意事項 |
|---|---|---|
| BufferedReader | 逐行讀取文字 | 搭配 InputStreamReader 指定編碼 |
| BufferedWriter | 緩衝寫入文字 | newLine() 跨平台換行 |
| String.split(",") | 簡單分割欄位 | 無法處理「欄位包含逗號/引號/換行」 |
| String.join(",", arr) | 陣列合併為 CSV 行 | 不自動加雙引號包裹 |
簡單 split(",") 無法正確處理:
"台北市,信義區""He said ""Hello"""<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.7.1</version>
</dependency>
// 讀取
try (CSVReader reader = new CSVReaderBuilder(new FileReader("data.csv")).build()) {
String[] line;
while ((line = reader.readNext()) != null) {
// line 已正確解析,處理逗號、引號、換行
}
}
// 寫入
try (CSVWriter writer = new CSVWriter(new FileWriter("out.csv"))) {
writer.writeNext(new String[]{"姓名", "城市", "備註"});
writer.writeNext(new String[]{"王小明", "台北市,信義區", "含逗號欄位"});
}
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.10.0</version>
</dependency>
try (CSVParser parser = CSVFormat.DEFAULT.withFirstRecordAsHeader()
.parse(new FileReader("data.csv"))) {
for (CSVRecord record : parser) {
String name = record.get("姓名");
String city = record.get("城市");
// 以表頭名稱存取,不依賴欄位順序
}
}
StandardCharsets.UTF_8writer.write("\uFEFF");CSVParser 的迭代器模式而非 getRecords()