如何用Java解析CSV文件

2025-05-20 06:56:01
推荐回答(2个)
回答(1):

package com.test;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestImportCsv {

private InputStreamReader fr = null;
private BufferedReader br = null;

public TestImportCsv(String f) throws IOException {
fr = new InputStreamReader(new FileInputStream(f));
}

/**
* 解析csv文件 到一个list中 每个单元个为一个String类型记录,每一行为一个list。 再将所有的行放到一个总list中
*/
public List> readCSVFile() throws IOException {
br = new BufferedReader(fr);
String rec = null;// 一行
String str;// 一个单元格
List> listFile = new ArrayList>();
try {
// 读取一行
while ((rec = br.readLine()) != null) {
Pattern pCells = Pattern
.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");
Matcher mCells = pCells.matcher(rec);
List cells = new ArrayList();// 每行记录一个list
// 读取每个单元格
while (mCells.find()) {
str = mCells.group();
str = str.replaceAll(
"(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
str = str.replaceAll("(?sm)(\"(\"))", "$2");
cells.add(str);
}
listFile.add(cells);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fr != null) {
fr.close();
}
if (br != null) {
br.close();
}
}
return listFile;
}

public static void main(String[] args) throws Throwable {
TestImportCsv test = new TestImportCsv("D:/test.csv");
List> csvList = test.readCSVFile();
}

}

回答(2):

逐行读取,每一行的String用split(",")来分为数组,就OK了