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 を取得する方法がわかりません。
行を分割した後、コンマを区切り文字として使用して 2 番目の部分文字列を再度分割しない限り、最大 2 つの部分があります。

           ....       
           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

1420|jskljal,dfkjdklj のような行になったときに起こっていたことを完全に見落として申し訳ありませんでした。

したがって、 splitline[1] には間違いなくテキストが含まれていました。これは、行に次のように記載されているためです。splitline[3] <<< splitLine[1] に長さがあるかどうかを確認してから、存在しない splitline[3] を選択しました。

于 2013-01-18T16:45:09.887 に答える
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 に答える