CSV(逗號分隔值)文件若直接用 Java IO 流處理,需手動處理分隔符、引號轉義、換行符等細節,開發效率低且易出錯。JavaCsv 庫封裝了完整的 CSV 解析與寫入邏輯,支援自定義分隔符、字元編碼、欄位引號等,極大簡化開發工作。
下載地址:https://pan.baidu.com/s/1i46ErFB
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();
}
}
"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"
"id","pid" "100000","空" "100001","空" "100046","100001" "100052","100001" "100088","100001"
| 方法 | 說明 |
|---|---|
| readRecord() | 讀取下一行,返回 boolean 表示是否成功 |
| getValues() | 返回當前行所有欄位值陣列 |
| getRawRecord() | 返回當前行原始未解析字串 |
| getCurrentRecord() | 返回當前記錄號(從 0 開始) |
| writeRecord(String[]) | 寫入一行記錄 |
| setForceQualifier(true) | 強制所有欄位加雙引號 |
JavaCsv 雖非最新庫(近年 Apache Commons CSV、OpenCSV 更活躍),但 API 簡潔穩定,對於維護舊專案或快速原型開發仍是不錯選擇。