Java两层嵌套for循环打印:输出重复、单独换行需求求助
解决嵌套循环处理CSV时输出重复的问题
嘿,我看你遇到了CSV处理时输出重复的问题,结合你给出的代码片段,大概率是嵌套循环的位置放错了导致的,我来帮你捋清楚:
问题根源
你目前的代码把内层for循环写在了读取行的while循环里面,这就意味着:每读取一行CSV内容并加入集合后,就会立刻遍历一次整个集合。比如读第2行时,集合里只有1条数据,循环输出1次;读第3行时,集合里有2条数据,循环输出2次……以此类推,最终输出自然会重复累加。
修正后的完整代码
先把所有行读取到集合(跳过第一行),再在while循环外面执行嵌套循环处理内容,这样就只会遍历一次集合:
// 注意路径里的反斜杠要转义,你之前多了一个尾部反斜杠也得去掉 BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\o.csv")); ArrayList<String> lines = new ArrayList<String>(); String line = br.readLine(); // 跳过第一行标题 // 读取剩余非空行 while ((line = br.readLine()) != null && !line.isEmpty()) { lines.add(line); } // 嵌套循环放在while外面,只执行一次遍历 for (int i = 0; i < lines.size(); i++) { // 拆分CSV的列(这里假设用逗号分隔,根据实际分隔符调整) String[] columns = lines.get(i).split(","); // 内层循环输出每个字段(每行独占一行) for (String column : columns) { System.out.println(column); } } br.close(); // 记得关闭流,避免资源泄漏
更优雅的写法(自动关闭流)
推荐用Java的try-with-resources语法,它会自动帮你关闭流,不用手动写close():
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\o.csv"))) { ArrayList<String> lines = new ArrayList<String>(); String line = br.readLine(); // 跳过第一行 while ((line = br.readLine()) != null && !line.isEmpty()) { lines.add(line); } // 增强for循环更简洁 for (String csvLine : lines) { String[] columns = csvLine.split(","); for (String col : columns) { System.out.println(col); } } } catch (IOException e) { // 捕获异常,方便排查问题 e.printStackTrace(); }
额外注意点
- 你的文件路径
"C:\Users\o.csv\"多了一个尾部反斜杠,而且Java里反斜杠需要用两个(\\)来转义,否则会报路径格式错误。 - 如果CSV里的字段包含逗号(比如带引号的字段),用
split(",")会拆分错误,这种情况建议用专门的CSV解析库来处理,但如果是简单场景,当前写法足够。
内容的提问来源于stack exchange,提问作者val
相关产品推荐
相关产品推荐

