Java读取CSV/文本文件如何不使用nextLine忽略换行符避免读取异常
问题解决方法
问题根源
你当前只将逗号,设置为Scanner的分隔符,换行符没有被纳入分隔规则,所以读取每行最后一个价格字段时,Scanner会把价格+换行符+下一行的编号当成连续的一段内容读取,才会出现字段错位的问题。
核心修正方案(无需使用nextLine)
修改Scanner的分隔符规则,同时匹配逗号和任意换行符即可,分隔符正则写成 ",|\\R",其中\\R可以匹配Windows的\r\n、Linux的\n等所有类型的换行符,兼容性更好。
修改后的完整代码
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Random; import java.util.Scanner; public class CsvReader { public static void main(String[] args) { try { File file = new File("...\\file.csv"); FileReader printReader = new FileReader(file); BufferedReader buffReader = new BufferedReader(printReader); Scanner scanner = new Scanner(buffReader); // 关键修改:同时将逗号和换行符设为分隔符 scanner.useDelimiter(",|\\R"); // 读取第一行第一个值作为总数校验 int max = Integer.parseInt(scanner.next()); System.out.println(max + " 总条目数"); // 初始化数组存储所有条目,每个条目存[编号,名称,价格] String[][] items = new String[max][3]; for (int i = 0; i < max; i++) { items[i][0] = scanner.next(); // 编号 items[i][1] = scanner.next(); // 名称 items[i][2] = scanner.next(); // 价格 } // 随机选一个条目 Random rand = new Random(); int randomIndex = rand.nextInt(max); // 选中的条目存入目标数组,按要求存储名称和价格 String[] selectedItem = new String[]{items[randomIndex][1], items[randomIndex][2]}; System.out.println("随机选中条目:名称=" + selectedItem[0] + ",价格=" + selectedItem[1]); buffReader.close(); scanner.close(); } catch (Exception e) { e.printStackTrace(); } } }
额外说明
- 如果后续CSV字段可能存在带逗号的特殊内容,可以考虑直接用BufferedReader的
readLine逐行读取后再按逗号拆分,逻辑会更清晰,也能避免特殊字符导致的解析问题。 - 代码里把原命名
Writer修改为scanner,避免和IO体系中的Writer类混淆,符合常规命名规范。
内容的提问来源于stack exchange,提问作者user17344681
相关产品推荐
相关产品推荐

