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

Ojalgo技术实现:从CSV文件加载Matrix矩阵

使用LineSplittingParser加载带表头的大型CSV为Matrix对象

没问题,我刚好有个简洁实用的示例,能帮你用LineSplittingParser处理带表头的大型CSV,最终转换成Matrix对象(这里用Apache Commons Math的RealMatrix,因为LineSplittingParser本身就是这个库的工具类)。

前提准备

首先确保你的项目里引入了Apache Commons Math依赖:
如果是Maven,在pom.xml里加:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version> <!-- 可替换为最新稳定版 -->
</dependency>

Gradle的话:

implementation 'org.apache.commons:commons-math3:3.6.1'

完整代码示例

import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.util.LineSplittingParser;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CsvToMatrixExample {
    public static void main(String[] args) {
        String csvFilePath = "your-large-file.csv";
        // 初始化LineSplittingParser:指定逗号为分隔符,忽略空白,不保留空字段
        LineSplittingParser parser = new LineSplittingParser(',', true, false);
        
        List<double[]> dataRows = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(new FileReader(csvFilePath))) {
            // 第一行是表头,直接跳过
            reader.readLine();
            
            String line;
            // 逐行读取解析,适合大型文件(内存友好,不会一次性加载全量数据)
            while ((line = reader.readLine()) != null) {
                // 解析当前行成字符串数组
                String[] values = parser.parse(line);
                // 转换成double数组(根据你的数据类型调整,比如整数转int)
                double[] row = new double[values.length];
                for (int i = 0; i < values.length; i++) {
                    row[i] = Double.parseDouble(values[i].trim());
                }
                dataRows.add(row);
            }
            
            // 将收集到的行转换成RealMatrix对象
            RealMatrix matrix = MatrixUtils.createRealMatrix(dataRows.toArray(new double[0][]));
            
            // 验证结果:打印矩阵的行数和列数
            System.out.println("矩阵行数:" + matrix.getRowDimension());
            System.out.println("矩阵列数:" + matrix.getColumnDimension());
            
        } catch (IOException e) {
            System.err.println("读取文件出错:" + e.getMessage());
        } catch (NumberFormatException e) {
            System.err.println("数据格式转换错误:" + e.getMessage());
        }
    }
}

关键细节说明

  • 内存友好:用BufferedReader逐行读取,配合LineSplittingParser逐行解析,不会把整个大型CSV加载到内存里,适合超大文件。
  • 跳过表头:通过reader.readLine()先读取第一行然后丢弃,轻松跳过表头。
  • 解析配置:LineSplittingParser的构造参数分别是:分隔符、是否忽略空白、是否保留空字段,你可以根据自己的CSV格式调整(比如如果有引号包裹的字段,可能需要额外处理,基础CSV用这个配置足够)。
  • 异常处理:捕获了文件IO异常和数据格式异常,避免程序崩溃,你可以根据需求扩展错误处理逻辑(比如记录错误行号)。

如果你的Matrix是其他库的实现(比如JAMA),只需要把最后转换成Matrix的部分替换成对应库的创建方法就行,核心的CSV解析逻辑是通用的。

内容的提问来源于stack exchange,提问作者Dr. Njitram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:22:48