今天用java读取csv文件,每行用split以逗号分隔存入数组,后来进行遍历的时候发现每行的数组的长度不一样。经过查阅资料发现了原因。csv文件中有几行的末尾是
,,,,,,D,,,,,,,,,,
这样的。而正常我们用
List<String[]> list = new ArrayList<String[]>();
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(new File(path)), "UTF-8"));
while((line = br.readLine()) != null) {
String[] header = line.split(",");
list.add(header);
}
这样会发现上面那个例子进行分割后数组最后一个字符串是“D”,而不是我们所期待的“”。
当然,如果需要保留“”填充进数组的话,就需要在使用split时指定长度,比如:
List<String[]> list = new ArrayList<String[]>();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)), "UTF-8"));
while((line = br.readLine()) != null) {
//length为指定的长度
String[] header = line.split(",", length);
list.add(header);
}
这样就可以达到我想要的效果。
在用split分隔csv文件时,需要注意引号中的逗号不能分隔,可以直接用正则表达式
,(?=([^\"]*\"[^\"]*\")*[^\"]*$)
这样的好处是只分隔引号外面的逗号,而不会分隔引号里面的逗号
String[] line = readLine.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");