一. csv文件解析:
1.supersuv解析和写入:
maven地址:
<dependency>
<groupId>net.sourceforge.supercsv</groupId>
<artifactId>supercsv</artifactId>
<version>1.52</version>
</dependency>
工具类:(解析csv文件封装成List<List<String>>)
/**
* 解析csv文件 到一个list中 每个单元个为一个String类型记录,每一行为一个list。 再将所有的行放到一个总list中 (包含头信息和数据信息)
*/
public static List<List<String>> readCSVFile(String filePaths) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePaths),"GBK");
BufferedReader br = new BufferedReader(isr);
List<List<String>> listFile = new ArrayList<List<String>>();
try {
CsvListReader reader = new CsvListReader(isr, CsvPreference.EXCEL_PREFERENCE);
//获取头信息
String[] split = Arrays.asList(reader.getCSVHeader(true)).get(0).split("\\s+");
List<String> list = Arrays.asList(split);
List<String> headerList=new ArrayList<String>();
for (String string : list) {
if(string.contains("?")) {
headerList.add(string.substring(0,string.length()-1));
}else {
headerList.add(string);
}
}
listFile.add(headerList);
//获取数据(非第一行数据)
List<String> read=new ArrayList<String>();
while((read=reader.read())!=null) {
//行数据
List<String> line=new ArrayList<String>();
String[] lineSplit = read.get(0).split("\\s+");
List<String> li = Arrays.asList(lineSplit);
for (String string : li) {
if(string.contains("?")) {
line.add(string.substring(0,string.length()-1));
}else {
line.add(string);
}
}
listFile.add(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (isr != null) {
isr.close();
}
if (br != null) {
br.close();
}
}
return listFile;
}
其中,若未知csv文件中字段个数或者字段个数太多,可考虑上面这种方式,使用CsvListReader来封装整个流对象,进而解析csv文件。
如果csv文件中字段已知而且个数也不是很多,可采用对象封装的方式,使用CsvBeanReader来封装整个流对象到指定的对象中。
当然也可以封装到map中,使用CsvMapReader来封装整个流对象到map中,可直接在map中获取。当然除了读取csv文件外,还有写入到csv文件,对应的CsvListWriter,CsvBeanWriter,CsvMapWriter,同上面。
2. javacsv解析csv文件和写入:
maven地址:
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.1</version>
</dependency>
API 说明文档:http://javacsv.sourceforge.net/
读取csv文件的工具类:
public static void read(){
String filePath = "XXX.csv";
try {
// 创建CSV读对象
CsvReader csvReader = new CsvReader(filePath);
// 读表头
csvReader.readHeaders();
while (csvReader.readRecord()){
// 读一整行
System.out.println(csvReader.getRawRecord());
// 读这行的某一列
System.out.println(csvReader.get("Link"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
写入csv文件的工具类:
public static void write(){
String filePath = "/Users/dddd/test.csv";
try {
// 创建CSV写对象
CsvWriter csvWriter = new CsvWriter(filePath,',', Charset.forName("GBK"));
//CsvWriter csvWriter = new CsvWriter(filePath);
// 写表头
String[] headers = {"编号","姓名","年龄"};
String[] content = {"12365","张山","34"};
csvWriter.writeRecord(headers);
csvWriter.writeRecord(content);
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.jdk自带的解析csv(通过流和正则表达式来解析csv):
读取csv文件:
/**
* 解析csv文件 到一个list中 每个单元个为一个String类型记录,每一行为一个list。 再将所有的行放到一个总list中(包含头信息和数据信息)
*/
public static List<List<String>> readCSVFile(String filePaths) throws IOException {
InputStreamReader fr=new InputStreamReader(new FileInputStream(filePaths),"GBK");
BufferedReader br = new BufferedReader(fr);
String rec = null;// 一行
String str;// 一个单元格
List<List<String>> listFile = new ArrayList<List<String>>();
try {
// 读取一行
while ((rec = br.readLine()) != null) {
int index=0;
Pattern pCells = Pattern
.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");
Matcher mCells = pCells.matcher(rec);
List<String> cells = new ArrayList<String>();// 每行记录一个list
// 读取每个单元格
while (mCells.find()) {
str = mCells.group();
str = str.replaceAll(
"(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
str = str.replaceAll("(?sm)(\"(\"))", "$2");
cells.add(str);
index = mCells.end();
}
cells.add(rec.substring(index));
listFile.add(cells);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fr != null) {
fr.close();
}
if (br != null) {
br.close();
}
}
return listFile;
}
可针对csv文件中的特殊字符,包括&,%,-,\,/等
可根据自己喜好选择解析csv文件的工具类。
CSV文件格式(Comma Separate Values):
每条记录占一行
以逗号为分隔符
逗号前后的分隔符会被忽略
字段中如果含有逗号,需要双引号括起来
字段中含有换行符,需要双引号括起来
字段中含有空格,需要双引号括起来
字段中含有双引号,需要双引号括起来
字段中的双引号用两个双引号表示
第一条记录可以是字段名
解析csv文件正则:(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,