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

CSV 文件生成與解析實戰指南

     編輯:Java 相關知識

CSV 格式本質

  • 純文本文件,編碼通常為 UTF-8 或 GBK
  • 每行對應一行數據,換行符 \r\n 或 \n
  • 字段間以半角逗號 , 分隔,含逗號/換行/引號的字段需雙引號包裹並轉義雙引號
  • 無標準化規範,RFC 4180 為事實標準

生成 CSV:核心代碼

import java.io.*;

public class CsvCreator {
    public static void main(String[] args) {
        String path = "C:/data/export.csv";
        try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))) {
            // 寫入表頭
            pw.write("ID,Name,Email,Score\r\n");
            // 寫入數據行
            pw.write("1,張三,zhang@example.com,95\r\n");
            pw.write("2,李四,\"li,si@example.com\",88\r\n"); // 含逗號字段加引號
            pw.write("3,王五,\"He said \\\"Hi\\\"\",76\r\n"); // 含引號轉義
            System.out.println("CSV 生成完成:" + path);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解析 CSV:使用 OpenCSV 庫(推薦)

手寫解析器易漏邊界情況(引號、換行、轉義),生產環境強烈建議使用成熟庫:

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

import com.opencsv.CSVReader;
import java.io.*;
import java.util.List;

public class CsvParser {
    public static void main(String[] args) {
        String path = "C:/data/export.csv";
        try (CSVReader reader = new CSVReader(new FileReader(path))) {
            List rows = reader.readAll();
            for (String[] row : rows) {
                System.out.printf("ID=%s, Name=%s, Email=%s, Score=%s%n", row);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

手寫簡易解析器(教學用)

public static List parseSimple(File file) throws IOException {
    List result = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            // 僅處理無引號、無轉義的簡單情況
            result.add(line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"));
        }
    }
    return result;
}

正則 ,(?=([^\"]*\"[^\"]*\")*[^\"]*$) 僅在引號外分割,但無法處理換行、轉義引號等複雜情況。

工程化注意事項

  • 編碼一致性:寫入時指定 UTF-8,讀取時同樣指定,避免中文亂碼
  • 大文件流式處理:OpenCSV CSVReader.readNext() 逐行讀取,避免 OOM
  • 類型轉換:解析後統一為字符串,業務層再按 Schema 轉換為實體對象
  • 異常行處理:記錄行號、原始內容、錯誤原因,便於人工修復
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved