C#读取CSV文件时遇System.IndexOutOfRangeException异常的解决咨询
解决CSV读取时的数组索引越界问题
方案1:写一个数组安全取值的扩展方法
封装索引判断逻辑,避免重复写条件,支持自定义默认值:
public static class ArrayExtensions { // 给string[]扩展安全取值方法,索引越界时返回默认值 public static string GetSafeValue(this string[] array, int index, string defaultValue = "") { return index >= 0 && index < array.Length ? array[index].Trim() : defaultValue; } }
使用示例:
// row为分割后的CSV行数组 var column6Value = row.GetSafeValue(5); // 取第6列(索引5),越界返回空字符串 var column12Value = row.GetSafeValue(11, "N/A"); // 自定义默认值为"N/A"
方案2:补全行数组到固定列数
读取每行后,将数组长度补到12列,缺失位置填充空字符串,之后可安全使用固定索引:
int expectedColumnCount = 12; string[] row = csvLine.Split(','); // 注意:简单Split无法处理带引号的CSV,复杂场景需用更严谨的分割逻辑 if (row.Length < expectedColumnCount) { Array.Resize(ref row, expectedColumnCount); // 填充新增位置为空字符串 for (int i = row.Length - (expectedColumnCount - row.Length); i < expectedColumnCount; i++) { row[i] = string.Empty; } } // 现在可直接用row[0]到row[11],不会触发越界异常 var column3 = row[2];
LINQ风格的简洁写法:
var row = csvLine.Split(',') .Take(expectedColumnCount) .Concat(Enumerable.Repeat(string.Empty, expectedColumnCount)) .Take(expectedColumnCount) .ToArray();
方案3:使用成熟的CSV处理库(推荐复杂场景)
如果CSV存在带引号的单元格、转义字符等复杂情况,自己分割易出问题,直接用专业库如CsvHelper(NuGet可安装),它能自动处理缺失列,映射到对象时自动设默认值:
using CsvHelper; using CsvHelper.Configuration; using System.Globalization; // 定义CSV行对应的实体类,预设默认值 public class CsvRowModel { public string Col1 { get; set; } = string.Empty; public string Col2 { get; set; } = string.Empty; // ... 依次定义到Col12 } // 读取代码 using var reader = new StreamReader("your_csv_file.csv"); var config = new CsvConfiguration(CultureInfo.InvariantCulture) { MissingFieldFound = null, // 缺失列时不抛出异常 TrimOptions = TrimOptions.Trim // 自动去除单元格前后空格 }; using var csv = new CsvReader(reader, config); var rows = csv.GetRecords<CsvRowModel>().ToList();
内容的提问来源于stack exchange,提问作者Stefan Fernström
相关产品推荐
相关产品推荐

