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
相关产品推荐
相关产品推荐

