解析文件时,索引超出了数组的范围
本文关键字:数组 范围 索引 文件 | 更新日期: 2023-09-27 17:54:45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace App
{
class Program
{
public static List<Types> List = new List<Types>();
static void Main(string[] args)
{
using (StreamReader read = new StreamReader(fileName.xml))
{
read.ReadLine();
while (!read.EndOfStream)
{
string line = read.ReadLine();
string[] splitline = line.Split('|');
Types t = new Types();
t.nbr = Convert.ToInt64(splitline[0].Trim());
t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";
List.Add(t);
}
}
}
}
}
public class Types
{
public Types()
{
}
public long nbr { get; set; }
public string addr { get; set; }
}
我用'|'分隔行,分隔后的文本也不包含任何这些'|'。它特别发生在
这一行t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";
我没有注意到文本解析有任何错误,因为我正在处理null和这样的
下面是一个文本的示例:
3612|
1412|123 Circle st Miami,FL,87678
1420|
3587|23 Hamm st Chicago,IL,98678
您正在尝试访问不存在的数组元素,这就是为什么您正在获得IndexOutOfRangeException异常。当尝试访问索引位于数组
边界之外的数组元素时,将引发该异常。在访问数组元素之前检查数组长度,并使用Using try-catch块来安全处理异常。
if(splitline > 0)
t.nbr = Convert.ToInt64(splitline[0].Trim());
if(splitline > 3)
t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";
我不知道如何使用上面的示例文本获得索引3。
分隔行之后,除非使用逗号作为分隔符再次分隔第二个子字符串,否则最多只能有两个部分。
....
while (!read.EndOfStream)
{
string line = read.ReadLine();
string[] splitline = line.Split('|', StringSplitOptions.RemoveEmptyEntries);
Types t = new Types();
Int64 num = 0;
if(Int64.TryParse(splitline[0].Trim(), out num))
{
t.nbr = num;
if(splitline.Length > 1)
{
// If you want the third substring of this second string
// i.e the 87678 from 1412|123 Circle st Miami,FL,87678
// string[] parts = splitline[1].Trim().Split(',');
// t.addr = (parts.Length > 2 ? parts[2] : "");
// If you want the whole string, no index 3
t.addr = splitline[1].Trim();
}
List.Add(t);
}
}
另外,对于这种程序来说,总是检查你是否有所有预期的部件是很好的实践。否则你会遇到严重的错误(索引超出范围)。
还要注意Int64.TryParse
的使用,以避免在行第一部分不是数字的情况下出现异常。
List<Types> list = new List<Types>();
String[] lines = File.ReadAllLines(filePath);
foreach (String line in lines)
{
String[] split = line.Split(new Char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Types t = new Types();
t.nbr = (split.Length > 0) ? Convert.ToInt64(split[0].Trim()) : 0;
t.addr = (split.Length > 3) ? ((split[1].Trim().Length > 1) ? split[3] : String.Empty) : String.Empty;
list.Add(t);
}
对不起,我完全忽略了一些事情,当这行看起来像这样:1420 | jskljal, dfkjdklj
so splitline[1]里面肯定有文本,因为这一行是这样写的:.addr = splitline[1]. trim()。长度> 1 ?splitline [3] & lt; & lt; & lt;我正在查看splitLine[1]是否有长度,然后选择一个不存在的splitLine[3]