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

Java 讀寫 CSV 檔案實作範例

     編輯:Java 程式設計入門

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 行不自動加雙引號包裹

CSV 解析陷阱與解決方案

簡單 split(",") 無法正確處理:

  • 欄位值包含逗號:"台北市,信義區"
  • 欄位值包含雙引號:"He said ""Hello"""
  • 欄位值包含換行符
  • 欄位前後空白保留需求

推薦:使用成熟函式庫

OpenCSV (最流行)

<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[]{"王小明", "台北市,信義區", "含逗號欄位"});
}

Apache Commons CSV

<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("城市");
        // 以表頭名稱存取,不依賴欄位順序
    }
}

編碼處理最佳實務

  • 預設使用 UTF-8:StandardCharsets.UTF_8
  • 中文 Windows 環境產出的 CSV 可能為 Big5/MS950,讀取時需指定
  • Excel 開啟 UTF-8 CSV 可能亂碼,可在檔案開頭加入 BOM:writer.write("\uFEFF");

大檔案處理建議

  • 串流處理,避免一次性載入記憶體
  • 使用 CSVParser 的迭代器模式而非 getRecords()
  • 考慮多執行緒平行處理(需無行間依賴)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved