加载txt文件时遇到System.IndexOutOfRangeException

本文关键字:System IndexOutOfRangeException 遇到 txt 文件 加载 | 更新日期: 2023-09-27 17:58:33

我正在尝试加载一个以特定格式编写的txt文件,然后遇到System.IndexOutOfRangeException。你知道我的代码出了什么问题吗?非常感谢。

txt文件:

P§Thomas§40899§2§§§
P§Damian§40726§1§§§

p=人员;Thomas=名字;40899=ID;2=状态

这是我的代码:

using (StreamReader file = new StreamReader(fileName))
            {
                while (file.Peek() >= 0)
                {
                    string line = file.ReadLine();
                    char[] charSeparators = new char[] { '§' };
                    string[] parts = line.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
                    foreach (PersonId personids in PersonIdDetails)
                    {
                        personids.ChildrenVisualisation.Clear();
                        foreach (PersonId personidchildren in personids.Children)
                        {
                            personidchildren.FirstName = parts[1];
                            personidchildren.ID = parts[2];
                            personidchildren.Status = parts[3];
                            personids.ChildrenVisualisation.Add(personidchildren);
                        }
                    }                             
                }
            }

在[1]部分,引发了异常。

加载txt文件时遇到System.IndexOutOfRangeException

您应该检查parts是否有足够的项目:

  ...
  string[] parts = line.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
  foreach (PersonId personids in PersonIdDetails) {
    personids.ChildrenVisualisation.Clear();
    // Check if parts have enough infirmation: at least 3 items
    if (parts.Length > 3) // <- Pay attention for "> 3"
      foreach (PersonId personidchildren in personids.Children) {
        //TODO: Check, do you really start with 1, not with 0?
        personidchildren.FirstName = parts[1];
        personidchildren.ID = parts[2];
        personidchildren.Status = parts[3];
        personids.ChildrenVisualisation.Add(personidchildren);
      }
    else {
      // parts doesn't have enough data
      //TODO: clear personidchildren or throw an exception 
    } 
  }   
  ...

我的印象是实际文件并没有那么大,所以使用File.ReadAllLines可能会很有用(con是指您需要将整个文件存储在内存中),这会为您提供所有行。

此外,删除空的或只是空白的行可能是必要的。

        foreach (var line in File.ReadAllLines(fileName).Where(l => !string.IsNullOrWhiteSpace(l))
        {
           char[] charSeparators = new char[] { '§' };
           string[] parts = line.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
           foreach (PersonId personids in PersonIdDetails)
           {
             personids.ChildrenVisualisation.Clear();
             foreach (PersonId personidchildren in personids.Children)
             {
               personidchildren.FirstName = parts[1];
               personidchildren.ID = parts[2];
               personidchildren.Status = parts[3];
               personids.ChildrenVisualisation.Add(personidchildren);
             }
           }
         }

将第一行更改为使用(StreamReader文件=新的StreamReader(fileName,Encoding.GetEncoding("iso-8859-1"));

可能的方法,它只是多个解决方案之间的一个解决方案

    using (StreamReader file = new StreamReader(fileName))
        {
            while (file.Peek() >= 0)
            {
                string line = file.ReadLine();
                char[] charSeparators = new char[] { '§' };
                string[] parts = line.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
                foreach (PersonId personids in PersonIdDetails)
                {
                    personids.ChildrenVisualisation.Clear();
                    foreach (PersonId personidchildren in personids.Children)
                    {
                       if(parts.Length > 3)//Only if you want to save lines with all parts but you can create an else clause for other lines with 1 or 2 parts depending on the length
                       {
                        personidchildren.FirstName = parts[1];
                        personidchildren.ID = parts[2];
                        personidchildren.Status = parts[3];
                        personids.ChildrenVisualisation.Add(personidchildren);
                       }
                    }
                }                             
            }
        }