需求: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; }
输出结果:得到了想要的结果
本文简要介绍了Java 方法中循环调用具有事务的具体方法示例,虽然@Transactional是Spring中最常用和推荐的方式,但是本文还简要介绍了其他5种方法可以实现类似的功能。