C#读取CSV计算年龄分布时遭遇类型转换未处理异常问题
字符串转整数异常的修复方案
你遇到的字符串转int异常,核心原因是Int32.Parse在处理非数字内容、空值或格式错误的字符串时会直接抛出未处理异常,再加上CSV可能存在表头行、行数据格式不规范的情况,就容易触发错误。同时你的代码里还有年龄区间判断的逻辑错误,下面是完整的修复方案:
关键改动说明
- 安全转换整数:用
int.TryParse替代Int32.Parse,它通过返回值告知转换是否成功,不会直接抛异常。 - 跳过表头行:如果CSV第一行是列名,直接遍历所有行会把表头当成数据处理,必须跳过。
- 避免索引越界:分割每行后先检查数组长度,防止访问不存在的
values[2]。 - 修正区间判断逻辑:把原来的
||改成&&,否则年龄区间判断完全失效。 - 额外边界处理:处理出生年份大于当前年的负数年龄,以及无有效数据时的除以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
相关产品推荐
相关产品推荐

