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
相关产品推荐
相关产品推荐

