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

C#读取CSV计算年龄分布时遭遇类型转换未处理异常问题

字符串转整数异常的修复方案

你遇到的字符串转int异常,核心原因是Int32.Parse在处理非数字内容、空值或格式错误的字符串时会直接抛出未处理异常,再加上CSV可能存在表头行、行数据格式不规范的情况,就容易触发错误。同时你的代码里还有年龄区间判断的逻辑错误,下面是完整的修复方案:

关键改动说明

  1. 安全转换整数:用int.TryParse替代Int32.Parse,它通过返回值告知转换是否成功,不会直接抛异常。
  2. 跳过表头行:如果CSV第一行是列名,直接遍历所有行会把表头当成数据处理,必须跳过。
  3. 避免索引越界:分割每行后先检查数组长度,防止访问不存在的values[2]。
  4. 修正区间判断逻辑:把原来的||改成&&,否则年龄区间判断完全失效。
  5. 额外边界处理:处理出生年份大于当前年的负数年龄,以及无有效数据时的除以0问题。

修复后的完整代码

public static int getAge(int yearOfBirth) 
{
    int currentYear = DateTime.Now.Year;
    int age = currentYear - yearOfBirth;
    // 避免出现负数年龄
    return Math.Max(0, age);
}

public static void distributionByAge()
{
    int child = 0; // 0-16岁
    int youngAdults = 0; // 17-30岁
    int middleAged = 0; // 31-55岁
    int oldAged = 0; // 55岁以上

    var lines = File.ReadAllLines(@"data.csv"); 
    // 跳过CSV表头行,如果没有表头可删除此行
    var dataLines = lines.Skip(1);

    foreach (var line in dataLines) 
    {
        string[] values = line.Split(","); 
        // 检查行数据是否有足够的字段,防止索引越界
        if (values.Length < 3)
        {
            continue;
        }
        // 去掉字符串前后空格,避免空格导致转换失败
        string birthYearStr = values[2].Trim(); 

        // 安全转换字符串到整数
        if (!int.TryParse(birthYearStr, out int birthYear))
        {
            // 转换失败则跳过该行
            continue;
        }

        int age = getAge(birthYear);

        // 修正区间判断逻辑,使用&&而非||
        if (age >= 0 && age <= 16)
        {
            child++;
        }
        else if (age >= 17 && age <= 30)
        {
            youngAdults++;
        }
        else if (age >= 31 && age <= 55)
        {
            middleAged++;
        }
        else if (age > 55)
        {
            oldAged++;
        }
    }

    int total = child + youngAdults + middleAged + oldAged;
    // 避免无有效数据时除以0
    if (total == 0)
    {
        Console.WriteLine("未读取到有效数据");
        return;
    }

    Console.WriteLine("-------------------------------------------------------------------");
    Console.WriteLine($"儿童: {getPercentage(total, child)}%");
    Console.WriteLine("-------------------------------------------------------------------");
    Console.WriteLine($"青年: {getPercentage(total, youngAdults)}%");
    Console.WriteLine("-------------------------------------------------------------------");
    Console.WriteLine($"中年: {getPercentage(total, middleAged)}%");
    Console.WriteLine("-------------------------------------------------------------------");
    Console.WriteLine($"老年: {getPercentage(total, oldAged)}%");
}

// 实现占比计算方法
public static double getPercentage(int total, int count)
{
    // 保留两位小数
    return Math.Round((double)count / total * 100, 2);
}

内容的提问来源于stack exchange,提问作者Eylül Naz Özcan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:55:40