
本文介绍如何从 CSV 文件逐行读取、按逗号拆分每行数字,并将所有数字统一合并到一个一维字符串数组中,适用于处理类似 20,16,23,... 的多行结构化数值数据。
本文介绍如何从 csv 文件逐行读取、按逗号拆分每行数字,并将所有数字统一合并到一个一维字符串数组中,适用于处理类似 `20,16,23,...` 的多行结构化数值数据。
在 Java 中,将 CSV 文件中“每行含多个逗号分隔数字”的数据扁平化为单个一维数组(如 Data[0] = "20", Data[1] = "16"),关键在于两步:逐行解析 + 扁平化合并。原始代码仅将整行作为单个字符串存入 List
✅ 推荐方案:使用 ArrayList + split() + addAll()
这是最清晰、兼容性好(支持 Java 8+)、易于调试的实现方式:
import java.io.*;
import java.util.*;
public class CsvFlattener {
public static void main(String[] args) {
String file = "data.csv";
List<String> flatList = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) continue; // 跳过空行
flatList.addAll(Arrays.asList(line.split(",")));
}
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
return;
}
// 转换为字符串数组(如需)
String[] data = flatList.toArray(String[]::new);
// 验证前 12 个元素
for (int i = 0; i < Math.min(12, data.length); i++) {
System.out.printf("Data[%d] = %s%n", i, data[i]);
}
}
}✅ 输出示例(匹配预期):
Knowledge Graph - Csv Graph Loader Generator下载从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
Data[0] = 20 Data[1] = 16 Data[2] = 23 ... Data[10] = 20 Data[11] = 18
⚙️ 进阶方案:Java Stream(简洁函数式风格)
若偏好函数式编程且项目使用 Java 11+,可借助 Files.lines() 和流操作一次性完成:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
// 在 main 中:
List<String> flatList;
try {
flatList = Files.lines(Path.of("data.csv"))
.filter(line -> !line.trim().isEmpty()) // 过滤空行
.map(line -> line.split(","))
.map(Arrays::asList)
.flatMap(List::stream)
.collect(Collectors.toList());
} catch (IOException e) {
throw new RuntimeException("CSV 文件读取异常", e);
}
String[] data = flatList.toArray(String[]::new);⚠️ 注意事项:
- split(",") 默认不处理首尾空格,若 CSV 含空格(如 "20, 16"),建议改用 line.trim().split("\s*,\s*") 并配合正则清理;
- 若需转为 int[],可在收集后添加映射:
int[] intData = flatList.stream().mapToInt(Integer::parseInt).toArray();
- Files.lines() 自动处理资源关闭,但需确保路径存在且有读取权限;
- 大文件场景下,流式处理内存更友好;小文件二者性能差异可忽略。
✅ 总结
核心逻辑始终是:行 → 拆分 → 扁平合并。避免将整行字符串直接存入列表,而应主动解析其内部结构。推荐初学者优先使用 ArrayList.addAll(Arrays.asList(...)) 方案——语义明确、调试直观、容错性强;进阶用户可选用 Stream 版本提升代码表达力。无论哪种方式,最终均可无缝获得索引连续、按 CSV 原始顺序排列的一维数据数组。


















