需求: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;
}
输出结果:得到了想要的结果