如何用Java读取CSV指定列(不含表头)并存入ArrayList(不使用第三方依赖)
Java原生实现读取CSV指定列数据
实现前提
本方案仅适用于字段内不含逗号、双引号、换行等CSV特殊转义字符的简单CSV文件,若存在复杂格式场景建议使用专业CSV处理库。
实现逻辑
- 读取CSV第一行表头,定位目标列对应的下标索引
- 逐行读取后续数据,按逗号切割每行字段
- 过滤空值后,将有效数据存入
ArrayList
完整代码示例
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class CsvReader { /** * 读取CSV指定列的非空有效数据 * @param filePath CSV文件路径 * @param targetColumnName 目标列名(和表头匹配) * @return 不含表头的有效数据集合 * @throws IOException 文件读取异常 * @throws IllegalArgumentException 目标列不存在时抛出 */ public static ArrayList<String> readSpecifiedColumn(String filePath, String targetColumnName) throws IOException { ArrayList<String> resultList = new ArrayList<>(); // 用try-with-resources自动关闭流 try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { // 读取表头行 String headerLine = br.readLine(); if (headerLine == null) { return resultList; } String[] headers = headerLine.split(","); // 定位目标列下标 int targetIndex = -1; for (int i = 0; i < headers.length; i++) { if (headers[i].trim().equals(targetColumnName)) { targetIndex = i; break; } } if (targetIndex == -1) { throw new IllegalArgumentException("目标列不存在:" + targetColumnName); } // 读取数据行 String dataLine; while ((dataLine = br.readLine()) != null) { String[] fields = dataLine.split(","); // 避免下标越界 if (fields.length > targetIndex) { String value = fields[targetIndex].trim(); // 仅保留非空有效数据 if (!value.isEmpty()) { resultList.add(value); } } } } return resultList; } public static void main(String[] args) { try { // 读取age列 ArrayList<String> ageList = readSpecifiedColumn("test.csv", "age"); // 输出结果:[111, 2232, 32332] 和样例需求匹配 System.out.println(ageList); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 如果CSV非UTF-8编码,可将
FileReader替换为InputStreamReader自行指定字符编码,避免乱码 - 如果需要存储整数类型,可在存入
ArrayList时做类型转换即可
内容的提问来源于stack exchange,提问作者reem ahmad
相关产品推荐
相关产品推荐

