需求:java读取一个csv文件并将文件内容每行按照","隔开
场景一:
读取1.csv文件:文件内容如下:
1,zhangsan,note
2,lisi,
注意:第二行逗号后面没有数据
public static void main(String[] args) {String csvFile = "C:\\Users\\yc\\Desktop\\1.csv";String line;try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取CSV文件的每一行while ((line = br.readLine()) != null) {// 根据分隔符拆分行数据String[] data = line.split(",");// 打印行数据System.out.println("-----------长度:"+data.length);for(int i=0;i<data.length;i++){System.out.println(data[i]);}}} catch (IOException e) {e.printStackTrace();}}
输出结果:两行分割后数据长度不一样
如何让分割后的长度一样,避免下标溢出报错?修改代码,重点如下红色部分line.split(",",-1);加个-1
public static void main(String[] args) {String csvFile = "C:\\Users\\yc\\Desktop\\1.csv";String line;try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取CSV文件的每一行while ((line = br.readLine()) != null) {// 根据分隔符拆分行数据String[] data = line.split(",",-1);// 打印行数据System.out.println("-----------长度:"+data.length);for(int i=0;i<data.length;i++){System.out.println(data[i]);}}} catch (IOException e) {e.printStackTrace();}}
输出结果:长度一样了,第二行输出了一个空,如下图所示。
场景二:
读取2.csv文件:文件内容如下:
aaa,"[123213,123123]",bbbb
想分割成aaa,"[123213,123123]"和bbbb
上代码如下:
public static void main(String[] args) {String csvFile = "C:\\Users\\yc\\Desktop\\2.csv";String line;try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取CSV文件的每一行while ((line = br.readLine()) != null) {// 根据分隔符拆分行数据String[] data = line.split(",",-1);// 打印行数据System.out.println("-----------长度:"+data.length);for(int i=0;i<data.length;i++){System.out.println(data[i]);}}} catch (IOException e) {e.printStackTrace();}}
输出结果:事与愿违并没有出处想要的结果
修改代码:
public static void main(String[] args) {String csvFile = "C:\\Users\\yc\\Desktop\\2.csv";String line;try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取CSV文件的每一行while ((line = br.readLine()) != null) {// 根据分隔符拆分行数据List<String> data = splitString(line);// 打印行数据System.out.println("-----------长度:"+data.size());for(int i=0;i<data.size();i++){System.out.println(data.get(i));}}} catch (IOException e) {e.printStackTrace();}}public static List<String> splitString(String text) {List<String> result = new ArrayList<>();boolean inQuotes = false;StringBuilder sb = new StringBuilder();for (char c : text.toCharArray()) {if (c == '\"') {inQuotes = !inQuotes;sb.append(c);} else if (c == ',' && !inQuotes) {result.add(sb.toString());sb.setLength(0);} else {sb.append(c);}}result.add(sb.toString());return result;}
输出结果:得到了想要的结果