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

Java 操作 CSV 文件實戰:基於 JavaCsv 庫的讀寫與轉換範例

     編輯:Java 綜合教學

Java 操作 CSV 文件實戰:基於 JavaCsv 庫的讀寫與轉換範例

為什麼選擇 JavaCsv?

CSV(逗號分隔值)文件若直接用 Java IO 流處理,需手動處理分隔符、引號轉義、換行符等細節,開發效率低且易出錯。JavaCsv 庫封裝了完整的 CSV 解析與寫入邏輯,支援自定義分隔符、字元編碼、欄位引號等,極大簡化開發工作。

下載地址:https://pan.baidu.com/s/1i46ErFB

核心類別介紹

  • CsvReader:讀取 CSV,支援逐行解析、獲取原始記錄、欄位值陣列
  • CsvWriter:寫入 CSV,支援強制加引號、自定義分隔符、編碼設定

完整實戰範例:CSV 篩選轉換導出

import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import org.junit.Test;
import java.io.IOException;
import java.nio.charset.Charset;

public class TestCVS {
    
    @Test
    public void exportCsv() throws IOException {
        String srcCSV = "F:/cnt_programa.csv";
        String targetFile = "F:/test.csv";
        
        // 建立讀取器:指定分隔符、編碼
        CsvReader reader = new CsvReader(srcCSV, ',', Charset.forName("UTF-8"));
        // 建立寫入器
        CsvWriter writer = new CsvWriter(targetFile, ',', Charset.forName("UTF-8"));
        
        // 設定所有欄位強制加雙引號
        writer.setForceQualifier(true);
        
        String[] header = {};
        
        // 逐行讀取
        while (reader.readRecord()) {
            // 第一行作為表頭保存
            if (reader.getCurrentRecord() == 0) {
                header = reader.getValues();
            }
            
            // 顯示當前記錄號與原始內容
            System.out.print(reader.getCurrentRecord() + ".");
            System.out.println(reader.getRawRecord());
            
            // 取前兩欄:id、pid
            String[] tmp = {reader.getValues()[0], reader.getValues()[1]};
            
            // 業務邏輯:若 pid 為空或與表頭不符,替換為「空」
            if (!header[1].equals(tmp[1]) && ("".equals(tmp[1]) || tmp == null)) {
                tmp[1] = "空";
                writer.writeRecord(tmp);
            } else {
                writer.writeRecord(new String[]{reader.getValues()[0], reader.getValues()[1]});
            }
        }
        
        reader.close();
        writer.close();
    }
}

測試數據與結果對照

原始文件:cnt_programa.csv

"id","pid","no","serial","name","createtime"
"100000","","No100000","","公司新聞","2016/8/23 17:12:09"
"100001","","No100001","","熱點資訊","2016/8/24 17:12:36"
"100046","100001","No100046","1","銀行動態","2016/8/1 10:36:31"
"100052","100001","No100052","2","法律法規","2016/8/2 20:39:10"
"100088","100001","No100088","3","專業文庫","2016/8/5 19:05:47"

導出結果:test.csv

"id","pid"
"100000","空"
"100001","空"
"100046","100001"
"100052","100001"
"100088","100001"

關鍵 API 速查

方法說明
readRecord()讀取下一行,返回 boolean 表示是否成功
getValues()返回當前行所有欄位值陣列
getRawRecord()返回當前行原始未解析字串
getCurrentRecord()返回當前記錄號(從 0 開始)
writeRecord(String[])寫入一行記錄
setForceQualifier(true)強制所有欄位加雙引號

常見坑點提醒

  • 編碼一致性:讀寫端編碼必須一致(建議統一 UTF-8),否則中文易亂碼
  • 資源關閉:務必在 finally 區塊或 try-with-resources 中關閉 reader/writer
  • 大文件處理:JavaCsv 逐行流式處理,記憶體佔用穩定,適合大文件
  • 異常欄位數:若行欄位數不一致,getValues() 可能拋出異常,建議捕獲處理

JavaCsv 雖非最新庫(近年 Apache Commons CSV、OpenCSV 更活躍),但 API 簡潔穩定,對於維護舊專案或快速原型開發仍是不錯選擇。

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