CSV(Comma-Separated Values)是一種常見的分隔符文件格式,若直接使用 Java 的 IO 流讀寫,代碼較為繁瑣。本文介紹一個實用的第三方庫 Javacsv.jar,能大幅簡化 CSV 文件的解析與生成操作。
可從以下地址下載已包含依賴的壓縮包:
https://xiazai.jb51.net/201608/yuanma/javcsv(jb51.net).rar
下面的完整單元測試展示如何讀取一個 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());
String[] tmp = {reader.getValues()[0], reader.getValues()[1]};
// 若第二欄為空或與表頭不同,則填入「空」
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"
通過 CsvReader 與 CsvWriter 類,開發者能以極少的代碼完成 CSV 的讀取、轉換與寫入。該庫自動處理編碼、分隔符、引號轉義等細節,非常適合批量數據導入導出場景。