You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:03:25