Java读取CSV文件到二维数组并索引使用值的方案求助
核心问题
- 代码中声明了
List<List<String>> lines集合,但从未将拆分后的行数据存入该集合,仅在读取时临时打印,没有留存可供后续索引调用的结构化数据 - 拆分得到的所有字段值默认都是String类型,未做类型转换处理,整数、浮点数类型的值无法直接开展数学运算
- 循环终止条件设置为
i<27会累计读取27行内容(计数从0到26共27次循环),和读取26行数据的需求不匹配 - 直接使用
String.split(",")解析CSV存在逻辑缺陷:如果字段值本身被双引号包裹且内部包含逗号,会被错误拆分为多个字段,导致数据错位
实现代码
以下是基于JDK原生能力实现的版本,不需要引入额外依赖,读取后可以直接通过行列索引取值,也支持直接对数值类型做运算:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; public class CsvDataLoader { // 按需求定义固定尺寸的二维数组:13列、26行 private static final int ROW_COUNT = 26; private static final int COL_COUNT = 13; private static final String[][] dataGrid = new String[ROW_COUNT][COL_COUNT]; public static void main(String[] args) { System.out.println("Data from CSV file to be analysed:\n"); String filePath = "jrc-covid-19-all-days-of-world_ASSIGNMENT-FIXED.csv"; // 读取文件并存入二维数组 try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; int currentRow = 0; while ((line = reader.readLine()) != null && currentRow < ROW_COUNT) { String[] values = line.split(","); // 逐列存入数据,处理行长度不足13列的边界情况,避免数组越界 for (int col = 0; col < COL_COUNT; col++) { dataGrid[currentRow][col] = col < values.length ? values[col].trim() : ""; } currentRow++; } } catch (IOException e) { e.printStackTrace(); } // 测试:打印全部读取到的内容 for (String[] row : dataGrid) { System.out.println(Arrays.toString(row)); } // 测试:取整数做运算,示例为取第2行(索引1)第3列(索引2)的整数加100 // 注意:调用前需确认对应位置的字段类型为整数,避免转换报错 int intVal = getInt(1, 2); System.out.println("整数运算结果:" + (intVal + 100)); // 测试:取浮点数做运算,示例为取第3行(索引2)第5列(索引4)的浮点数乘2 double doubleVal = getDouble(2, 4); System.out.println("浮点数运算结果:" + (doubleVal * 2)); } // 按行列索引取字符串值 public static String getString(int row, int col) { if (row < 0 || row >= ROW_COUNT || col <0 || col >= COL_COUNT) { throw new IndexOutOfBoundsException("索引超出范围,有效行索引为0-25,有效列索引为0-12"); } return dataGrid[row][col]; } // 按行列索引取整数值 public static int getInt(int row, int col) { return Integer.parseInt(getString(row, col)); } // 按行列索引取双精度浮点值 public static double getDouble(int row, int col) { return Double.parseDouble(getString(row, col)); } }
使用说明
- 数组索引从0开始计数,第一行第一列对应索引
(0,0),最后一行最后一列对应索引(25,12) - 做类型转换前必须确认对应字段的实际类型,不要将存储文本的字段强行转为整数/浮点数,否则会抛出格式转换异常
- 如果需要读取的26行是跳过表头后的业务数据,只需要在进入读行循环前,先调用一次
reader.readLine()跳过第一行表头即可 - 如果你的CSV存在带引号的含逗号字段,不要用
split(",")做解析,可以替换为专门的CSV拆分逻辑,或者使用成熟的CSV解析组件处理,避免数据错位
内容的提问来源于stack exchange,提问作者Francois200212
相关产品推荐
相关产品推荐

