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

Java处理CSV文件int类型转换及数组问题(新手求助)

问题分析与修复方案

嘿,我看了你的代码,发现几个核心问题导致你处理int类型时遇到麻烦,甚至程序没法正常运行,来一步步帮你理清楚并修复:

1. 错误地把整行CSV转成整数

你写的int digit = Integer.valueOf(line);是大问题!line是整行的CSV数据(比如类似"2023-08-11,Arsenal,Man Utd,2-1,..."这样的字符串),直接把整行转成整数不仅运行时会抛出NumberFormatException,这也根本不是你想要的操作对吧?你应该是想提取某一列的数值(比如第12列的射门数,对应数组索引11)。

2. 无意义的数组创建

int[] shotsarr = new int[digit];这行完全没必要,你不需要新创建一个数组,直接把对应列的字符串转成整数就行,多此一举反而会引入错误。

3. 重复拆分字符串浪费资源

你两次调用line.split(csvSplitBy)生成tie和ref数组,这完全是冗余操作,复用一个数组就够了,既省内存又更简洁。


修复后的完整代码

package readcvs;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadCVS {
    public static void main(String[] args) {
        ReadCVS obj = new ReadCVS();
        obj.run();
    }

    public void run() {
        String csvFile = "/Users/hobbit/Desktop/E0.csv";
        BufferedReader br = null;
        String line = "";
        String csvSplitBy = ",";

        try {
            br = new BufferedReader(new FileReader(csvFile));
            // 如果你的CSV第一行是表头(比如有HomeTeam、AwayTeam这类字段名),就把这行打开跳过表头
            // br.readLine();
            
            while ((line = br.readLine()) != null) {
                // 只拆分一次,把所有列数据存在data数组里,后续直接用这个数组
                String[] data = line.split(csvSplitBy);
                
                // 输出对阵信息
                System.out.println(data[2] + " vs " + data[3]);
                // 输出裁判信息
                System.out.println("Referee: " + data[10]);
                
                // 提取射门数列(索引11),转为int类型
                try {
                    int homeShots = Integer.parseInt(data[11]);
                    System.out.println("Home team shots: " + homeShots);
                } catch (NumberFormatException e) {
                    // 万一这列不是有效数字(比如表头、空值或者脏数据),捕获异常给出提示
                    System.out.println("⚠️ Home team shots data invalid: " + data[11]);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

关键修复细节

  • 只执行一次line.split(),结果存在data数组里,所有列的提取都复用这个数组,避免重复劳动。
  • 直接针对你需要的列(data[11])用Integer.parseInt()转成int,而不是整行转换——这才是你真正需要的操作。
  • 加了内层的try-catch处理数据异常情况:比如该列是空字符串、非数字字符,或者CSV格式错位导致索引越界(你还可以额外加判断,比如先检查data.length > 11再提取,进一步避免报错)。
  • 注释里提到了如果CSV有表头可以跳过,避免处理表头时的转换错误,你可以根据自己的文件情况选择是否启用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:08