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

Java中如何将CSV数据加载到Project对象数组中?

解决方案:CSV转Project对象数组及省份统计实现

一、将CSV数据转换为Project对象数组

你已经能读取CSV行数据,接下来只需把每行数据映射到Project对象,再收集到集合/数组中即可。

1. 改造readFile方法,收集Project对象

将readFile改为返回List<Project>(数组长度不确定时用List更灵活,后续可转成数组),同时跳过CSV的表头行:

import java.util.*;
import java.io.*;

public class Assignment {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String path = "file_path"; // 替换为你的实际文件路径
        // 读取CSV并转换为Project列表
        List<Project> projectList = readFile(path);
        // 转成Project数组(如果作业要求必须用数组)
        Project[] projectArray = projectList.toArray(new Project[0]);
        
        // 测试输出所有Project对象信息
        for (Project p : projectArray) {
            System.out.println("省份:" + p.getProvince() + " | 项目名:" + p.getName());
        }
    }

    public static List<Project> readFile(String pFileName) {
        List<Project> projectList = new ArrayList<>();
        FileInputStream fileStream = null;
        InputStreamReader rdr;
        BufferedReader bufRdr;
        String line;
        try {
            fileStream = new FileInputStream(pFileName);
            rdr = new InputStreamReader(fileStream);
            bufRdr = new BufferedReader(rdr);
            // 跳过第一行表头
            line = bufRdr.readLine();
            // 读取第一行数据
            line = bufRdr.readLine();
            while (line != null) {
                Project project = processLine(line);
                if (project != null) {
                    projectList.add(project);
                }
                line = bufRdr.readLine();
            }
            fileStream.close();
        } catch (IOException errorDetails) {
            if (fileStream != null) {
                try {
                    fileStream.close();
                } catch (IOException ex2) {}
            }
            System.out.println("文件处理错误:" + errorDetails.getMessage());
        }
        return projectList;
    }

2. 修改processLine方法,生成Project对象

解析CSV行的字段,转换对应数据类型后调用Project构造器:

private static Project processLine(String csvRow) {
        String[] splitLine = csvRow.split(",");
        // 校验行数据字段数量(CSV表头有10个字段,数据行需满足基本长度)
        if (splitLine.length < 7) {
            System.out.println("无效数据行:" + csvRow);
            return null;
        }
        try {
            String province = splitLine[0];
            String beneficiary = splitLine[1];
            int beneficiaryNum = Integer.parseInt(splitLine[2]);
            String assetClass = splitLine[3];
            String name = splitLine[4];
            String stage = splitLine[6]; // PROJECT_STAGE_EN是第7个字段(索引从0开始)
            // 注意:你的Project类中location字段是单个double,但CSV包含LATITUDE和LONGITUDE两个字段
            // 这里暂时用纬度值填充location,建议后续修改Project类,拆分出latitude和longitude两个字段
            double location = Double.parseDouble(splitLine[7]);
            
            return new Project(province, beneficiary, beneficiaryNum, assetClass, name, stage, location);
        } catch (NumberFormatException e) {
            System.out.println("数据类型转换错误:" + e.getMessage());
            return null;
        }
    }
}

关键提示

  • 你的Project类中location字段设计不合理:CSV包含两个地理位置字段,建议修改类,将location拆分为latitude和longitude两个double字段,同步更新构造器、getter/setter方法。
  • 如果CSV字段内容包含逗号(比如项目描述里有逗号),split(",")会解析错误,作业允许的话可以用OpenCSV等专业库,否则需手动处理引号包裹的字段。

二、基于Project数组生成指定省份的统计信息

实现统计方法,接收Project数组和目标省份,可统计项目总数、资产类别分布等。

示例统计方法

// 统计指定省份的项目总数
public static int countProjectsByProvince(Project[] projects, String targetProvince) {
    int count = 0;
    for (Project p : projects) {
        // 忽略大小写匹配省份
        if (p.getProvince().equalsIgnoreCase(targetProvince)) {
            count++;
        }
    }
    return count;
}

// 统计指定省份各资产类别的项目数量
public static Map<String, Integer> countAssetClassesByProvince(Project[] projects, String targetProvince) {
    Map<String, Integer> assetCountMap = new HashMap<>();
    for (Project p : projects) {
        if (p.getProvince().equalsIgnoreCase(targetProvince)) {
            String assetClass = p.getAssetClass();
            assetCountMap.put(assetClass, assetCountMap.getOrDefault(assetClass, 0) + 1);
        }
    }
    return assetCountMap;
}

在main方法中调用统计逻辑

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String path = "file_path";
    List<Project> projectList = readFile(path);
    Project[] projectArray = projectList.toArray(new Project[0]);
    
    // 获取用户输入的目标省份
    System.out.print("请输入要统计的省份:");
    String targetProvince = input.nextLine();
    
    // 输出统计结果
    int total = countProjectsByProvince(projectArray, targetProvince);
    System.out.println(targetProvince + " 共有项目:" + total + "个");
    
    Map<String, Integer> assetStats = countAssetClassesByProvince(projectArray, targetProvince);
    System.out.println("各资产类别分布:");
    for (Map.Entry<String, Integer> entry : assetStats.entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue() + "个");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:28:10