加载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]部分,引发了异常。
您应该检查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);
}
}
}
}
}