读取CSV文件并在不同大小的行上获取超出范围的索引异常

本文关键字:获取 异常 索引 范围 文件 CSV 读取 | 更新日期: 2023-09-27 18:24:31

我写了一个简短的方法,从CSV文件中读取行,并用列值构建一个患者。然而,当列数据不存在并抛出"索引超出范围异常"时,它似乎不喜欢这样。我理解这是因为该行的数组值为0,但这可能会有所不同。我该如何解决这个问题?

在创建有效的对象之前,我曾尝试检查数组的长度是否超过0,但当数组在一行中只找到一列时,它再次引发异常。

这是我接受文件路径的方法:

 public static List<PatientObject> SplitFiles(String file)
        {
            List<PatientObject> PatientList = new List<PatientObject>();

                var reader = new StreamReader(File.OpenRead(file));
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split('|');

                    PatientList.Add(new PatientObject(values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15], values[16], values[17]));
                }
            return PatientList;
        }

提前感谢

读取CSV文件并在不同大小的行上获取超出范围的索引异常

由于您不检查实际得到的字段数量,因此当一行中没有至少18个值时,它当然会崩溃。最佳解决方案取决于您的确切情况,但以下是一些可能的方法:

  • 至少,当行中没有>=18个元素时,您可能应该跳过这一行——您可能应该记录跳过它们的事实,以避免以后混淆
  • 如果少于18个元素,则可以向数据库提供默认值,或者提供指示该字段没有输入的值

编辑:您也可以切换到现有的CSV阅读库。我已经成功地使用了一个快速CSV阅读器,如果它为缺失的字段场景提供了几个解决方案。

我建议您对每个这样的字段使用"??"运算符(当然,如果您不想使用@fvu建议的解决方案):

PatientList.Add(new PatientObject(values[0] ?? "", values[1] ?? "", values[2] ?? "", values[3] ?? "", values[4] ?? "", values[5] ?? "", values[6] ?? "", values[7] ?? "", values[8] ?? "", values[9] ?? "", values[10] ?? "", values[11] ?? "", values[12] ?? "", values[13] ?? "", values[14] ?? "", values[15] ?? "", values[16] ?? "", values[17] ?? ""));