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

如何从CSV文件拆分商品名与数量并忽略店铺名存入HashMap列表?

实现方案:读取CSV并提取商品到HashMap

我来帮你搞定这个需求!咱们先梳理下现有代码的问题,然后给出完整的实现:

原代码的主要问题

  • break;的位置错误:当line == null时直接break,但后续代码(拆分、存入Map)会因为line为null抛出空指针异常,而且逻辑根本无法执行到循环体的有效代码块。
  • 未区分店铺行与商品行:没有判断行是否是店铺标识(以>开头),会错误地处理店铺行。
  • 缺少商品数据的解析与存入逻辑:拆分后没有将商品名和数量转换为对应类型并存入HashMap。
  • 资源未正确关闭:未关闭BufferedReader和FileReader,存在资源泄漏风险。

修正后的完整代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class ListRead {
    // 用HashMap存储商品名(key)和数量(value)
    private HashMap<String, Integer> csvList = new HashMap<>();

    public void loadManifest() throws IOException {
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (FileReader listCSV = new FileReader("list.csv");
             BufferedReader reader = new BufferedReader(listCSV)) {

            String line;
            // 逐行读取,直到line为null(文件末尾)
            while ((line = reader.readLine()) != null) {
                // 跳过店铺行(以">"开头的行)
                if (line.startsWith(">")) {
                    continue;
                }

                // 拆分每行数据,按逗号分隔
                String[] listElement = line.split(",");
                // 确保拆分后有两个元素(商品名和数量)
                if (listElement.length == 2) {
                    // 去除元素前后的空格,避免干扰
                    String itemName = listElement[0].trim();
                    try {
                        // 将数量字符串转为Integer类型
                        Integer quantity = Integer.parseInt(listElement[1].trim());
                        // 存入HashMap
                        csvList.put(itemName, quantity);
                    } catch (NumberFormatException e) {
                        // 处理数量格式错误的情况,比如非数字的内容
                        System.err.println("无效的数量格式:" + line);
                        e.printStackTrace();
                    }
                } else {
                    // 处理格式不正确的行
                    System.err.println("格式错误的行:" + line);
                }
            }
        }
        // 可选:打印结果验证
        System.out.println("提取的商品列表:" + csvList);
    }

    // 提供获取HashMap的方法,方便外部访问数据
    public HashMap<String, Integer> getCsvList() {
        return csvList;
    }

    public static void main(String[] args) {
        ListRead reader = new ListRead();
        try {
            reader.loadManifest();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键逻辑说明

  1. 自动关闭资源:使用try-with-resources语法,在代码块结束后自动关闭FileReader和BufferedReader,无需手动调用close(),避免资源泄漏。
  2. 忽略店铺行:通过line.startsWith(">")判断当前行是否为店铺标识,若是则跳过该行。
  3. 数据清洗与转换:拆分后用trim()去除每个元素前后的空格,避免CSV中可能存在的空格干扰;将数量字符串转为Integer类型,存入HashMap。
  4. 异常处理:添加NumberFormatException捕获,处理数量不是有效数字的情况;同时处理拆分后元素数量不符合预期的行,增强代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:37:50