Java如何遍历CSV文件读取生成的数组以访问指定值
问题原因
你当前的代码里,processLine方法拆分CSV行得到的splitLine数组是方法内部的局部变量,方法执行完就会被回收,没有做持久化存储,所以main方法里没法直接访问到拆分后的数据。要实现需求,只需要把读取到的所有拆分后的行统一存储到一个集合里,再把这个集合返回给调用方即可。
修改方案
- 把
readFile方法的返回值从void改成List<String[]>,用来存所有拆分后的CSV行数据 - 调整
processLine逻辑,不再内部打印,而是直接返回拆分好的行数组 - 在
main方法里接收readFile返回的集合,就可以随意遍历、访问指定位置的元素了
修改后可直接运行的代码
import java.io.*; import java.util.ArrayList; import java.util.List; public class MainMenu { public static List<String[]> readFile(String file) { // 存储所有拆分后的CSV行,每个元素是一行拆分得到的字符串数组 List<String[]> csvData = new ArrayList<>(); FileInputStream fileStream = null; InputStreamReader isr; BufferedReader bufRdr; int lineNum; String line; try { fileStream = new FileInputStream(file); isr = new InputStreamReader(fileStream); bufRdr = new BufferedReader(isr); lineNum = 0; line = bufRdr.readLine(); while((line != null) && lineNum < 27) { lineNum++; // 把拆分好的行存入集合 csvData.add(processLine(line)); line = bufRdr.readLine(); } fileStream.close(); } catch (IOException e) { if(fileStream != null) { try { fileStream.close(); } catch(IOException ex2) { } } System.out.println("Error: "+e.getMessage()); } return csvData; } private static String[] processLine(String csvRow) { // 直接返回拆分后的数组,不在这个方法里做打印逻辑 return csvRow.split(","); } public static void main(String[] args) { System.out.println("============================================"+"\n"+"Data from CSV file to be analysed:"+"\n"); List<String[]> csvData = readFile("jrc-covid-19-all-days-of-world_ASSIGNMENT-FIXED.csv"); System.out.println("============================================"); // 示例1:遍历所有数据打印 for (int i = 0; i < csvData.size(); i++) { String[] row = csvData.get(i); System.out.printf("第%d行内容:", i+1); for (String cell : row) { System.out.print(cell + " "); } System.out.println(); } // 示例2:访问指定位置的元素,比如拿第3行(索引2)第2列(索引1)的值 if (csvData.size() > 2 && csvData.get(2).length > 1) { String targetVal = csvData.get(2)[1]; System.out.println("第3行第2列的值是:" + targetVal); } } }
注意事项
- 用
String.split(",")拆分CSV只适用于单元格内容里完全没有逗号的场景,如果CSV单元格本身带包裹在引号里的逗号,这个拆分逻辑会出错,需要换成专门的CSV解析工具处理 - 访问数组/集合元素前一定要先做长度判断,避免索引越界报错
内容的提问来源于stack exchange,提问作者Francois200212
相关产品推荐
相关产品推荐

