0
 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
4

4 回答 4

2

您正在尝试访问不存在的数组元素,这就是您收到IndexOutOfRangeException异常的原因。当尝试访问具有超出数组边界的索引的数组元素时,将引发异常

在访问其元素之前检查数组长度并使用使用 try-catch 块来安全地处理异常。

if(splitline > 0)
      t.nbr = Convert.ToInt64(splitline[0].Trim());  
if(splitline > 3)
      t.addr = splitline[1].Trim().Length > 1 ? splitline[3] : "";
于 2013-01-18T16:37:51.310 回答
1

而且我看不出如何使用上面的示例文本获得索引 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来避免异常,以防您的行的第一部分不是数字。

于 2013-01-18T16:41:36.120 回答
0
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);
}
于 2013-01-18T16:44:11.200 回答
0

抱歉,当该行如下所示时,我完全忽略了正在发生的事情: 1420|jskljal,dfkjdklj

所以 splitline[1] 肯定有文本,这是因为该行说: t.addr = splitline[1].Trim().Length > 1 ?splitline[3] <<< 我看到 splitLine[1] 是否有长度,然后选择一个不存在的 splitline[3]。

于 2013-01-18T16:45:09.887 回答