如何使用firstRecord.size()统计CSV列数?代码失效求助
解决Apache Commons CSV统计列数及二维数组初始化问题
问题分析
你代码里的firstRecord未定义就直接调用size(),这会导致编译或运行错误。另外,由于你启用了withFirstRecordAsHeader(),可以更直接地获取列数,无需依赖数据记录。
正确获取列数的两种方法
方法1:通过CSVParser表头信息获取(推荐)
开启withFirstRecordAsHeader()后,CSVParser会自动将第一行解析为表头,调用getHeaderNames()可获取所有列名的列表,其长度即为列数:CSVParser parser = new CSVParser( new FileReader(CSV_IMPORT_PATH), CSVFormat.DEFAULT .withFirstRecordAsHeader() .withIgnoreHeaderCase() .withTrim() ); // 获取列数 int columnCount = parser.getHeaderNames().size(); System.out.println("列数:" + columnCount);方法2:从第一条数据记录获取
若要从实际数据行中获取列数,需先从getRecords()返回的列表中取出第一条记录(此时列表第一条是数据行,表头已被单独解析):List<CSVRecord> list = parser.getRecords(); if (!list.isEmpty()) { CSVRecord firstRecord = list.get(0); int columnCount = firstRecord.size(); System.out.println("列数:" + columnCount); }
结合二维数组的完整示例
获取列数后,即可初始化二维数组存储CSV数据:
CSVParser parser = new CSVParser( new FileReader(CSV_IMPORT_PATH), CSVFormat.DEFAULT .withFirstRecordAsHeader() .withIgnoreHeaderCase() .withTrim() ); List<CSVRecord> records = parser.getRecords(); if (records.isEmpty()) { // 处理空文件场景 return; } // 获取列数 int columnCount = parser.getHeaderNames().size(); // 初始化二维数组:行数为记录总数,列数为CSV列数 String[][] csvData = new String[records.size()][columnCount]; // 循环填充数组 for (int i = 0; i < records.size(); i++) { CSVRecord record = records.get(i); for (int j = 0; j < columnCount; j++) { // 通过列索引获取对应值 csvData[i][j] = record.get(j); } } // 验证输出 System.out.println("二维数组行数:" + csvData.length); System.out.println("二维数组列数:" + csvData[0].length);
注意事项
- 若CSV文件包含空行,
getRecords()会返回空的CSVRecord,可在循环时通过record.size() > 0过滤无效行 - 使用
record.get(j)时,需确保索引j不超过columnCount-1,避免数组越界
内容的提问来源于stack exchange,提问作者Jacek Antek
相关产品推荐
相关产品推荐

