Java CSV control

package com.excel.test;

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

/*
* 文件规则
* Microsoft的格式是最简单的。以逗号分隔的值要么是“纯粹的”(仅仅包含在括号之前),
* 要么是在双引号之间(这时数据中的双引号以一对双引号表示)。
* Ten Thousand,10000, 2710 ,,"10,000","It's ""10 Grand"", baby",10K
* 这一行包含七个字段(fields):
* Ten Thousand
* 10000
* 2710
* 空字段
* 10,000
* It's "10 Grand", baby
* 10K
* 每条记录占一行
* 以逗号为分隔符
* 逗号前后的空格会被忽略
* 字段中包含有逗号,该字段必须用双引号括起来。如果是全角的没有问题。
* 字段中包含有换行符,该字段必须用双引号括起来
* 字段前后包含有空格,该字段必须用双引号括起来
* 字段中的双引号用两个双引号表示
* 字段中如果有双引号,该字段必须用双引号括起来
* 第一条记录,可以是字段名
*/
/**


public class TestCSVRead {
private InputStreamReader fr = null;
private BufferedReader br = null;

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

/**
* 解析csv文件 到一个list中
* 每个单元个为一个String类型记录,每一行为一个list。
* 再将所有的行放到一个总list中
* @return
* @throws IOException
*/
public List<List<String>> readCSVFile() throws IOException {
br = new BufferedReader(fr);
String rec = null;//一行
String str;//一个单元格
List<List<String>> listFile = new ArrayList<List<String>>();
try {
//读取一行
// if(br!=null) br.readLine();
while ((rec = br.readLine()) != null) {
Pattern pCells = Pattern
.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");

rec +=",";
Matcher mCells = pCells.matcher(rec);
List<String> cells = new ArrayList<String>();//每行记录一个list
//读取每个单元格

while (mCells.find()) {
// System.out.println(mCells.end());
str = mCells.group();
str = str.replaceAll(
"(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
str = str.replaceAll("(?sm)(\"(\"))", "$2");
// str = str.replaceAll("(.*)\"$", "$1");
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 {
TestCSVRead parser = new TestCSVRead("");


List<List<String>> list = parser.readCSVFile();
List<String> listTitle = list.get(20);
for(int i=0;i<listTitle.size();i++){
System.out.println(i+" ###### "+listTitle.get(i));
}



}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值