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

使用Java Scanner读取CSV文件并将表头与数据存入ArrayList的问题

用Scanner解析CSV并存储表头和数据到ArrayList

我来帮你搞定这个CSV解析的需求!你的核心需求是用Scanner把CSV的表头和对应数据分别存入两个ArrayList,同时指定分号(;)和双引号(")作为分隔符,咱们一步步来实现:

核心思路

  1. 配置Scanner的分隔符:用正则表达式[\";]来匹配分号或双引号,刚好符合你的要求。
  2. 逐行处理CSV:第一行是表头,存入names列表;第二行是数据,存入values列表。
  3. 过滤无效值:分割后可能会出现空字符串(比如字段前后的双引号或分号导致的),所以要过滤掉这些空内容,同时处理字段前后的空格。

完整代码实现

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class CsvScanner {
    private static Scanner sc;
    ArrayList<String> names = new ArrayList<String>();
    ArrayList<String> values = new ArrayList<String>();

    public void parseCsv(String filePath) {
        try {
            // 初始化Scanner读取CSV文件
            sc = new Scanner(new File(filePath));
            
            // 配置分隔符:匹配分号(;)或双引号(")
            sc.useDelimiter("[\";]");

            // 处理表头行
            if (sc.hasNextLine()) {
                Scanner lineScanner = new Scanner(sc.nextLine());
                lineScanner.useDelimiter("[\";]");
                while (lineScanner.hasNext()) {
                    String item = lineScanner.next().trim();
                    // 只添加非空的有效内容
                    if (!item.isEmpty()) {
                        names.add(item);
                    }
                }
                lineScanner.close();
            }

            // 处理数据行
            if (sc.hasNextLine()) {
                Scanner lineScanner = new Scanner(sc.nextLine());
                lineScanner.useDelimiter("[\";]");
                while (lineScanner.hasNext()) {
                    String item = lineScanner.next().trim();
                    if (!item.isEmpty()) {
                        values.add(item);
                    }
                }
                lineScanner.close();
            }

        } catch (FileNotFoundException e) {
            // 处理文件找不到的异常
            System.err.println("找不到指定的CSV文件:" + e.getMessage());
        } finally {
            // 确保Scanner资源被关闭
            if (sc != null) {
                sc.close();
            }
        }
    }

    // 测试用例
    public static void main(String[] args) {
        CsvScanner csvHandler = new CsvScanner();
        // 替换成你的CSV文件路径
        csvHandler.parseCsv("test.csv");
        
        System.out.println("表头列表: " + csvHandler.names);
        System.out.println("数据列表: " + csvHandler.values);
    }
}

关键细节说明

  • 分隔符正则[\";]:方括号表示匹配其中任意一个字符,这里就是分号和双引号,完美符合你的分隔需求。
  • 逐行处理的原因:直接用sc.next()会跨行读取,而我们需要严格区分表头行和数据行,所以用sc.nextLine()先拿到整行,再用一个新的Scanner处理该行内容。
  • trim()和非空判断:CSV里可能存在字段前后的空格,或者分隔符连续出现导致的空字符串,这两步能保证存入列表的都是有效内容。
  • 资源关闭和异常处理:finally块确保Scanner被关闭,避免资源泄漏;捕获FileNotFoundException能友好提示文件不存在的问题。

内容的提问来源于stack exchange,提问作者user7261540

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:03