1

このようなテキスト ファイルがあり、'|' ごとに分割しています。3 番目の「|」の間 は、2 つの列に分割する必要がある 2 つの単語です。分割を行うのに問題があります。

 Nbr| Address| Name   |Phone|City|State|Zip 
455 |gsgdgsg |fir last|434  |jk  |jh   |0393

分割を行い、出力をリストに書き込むこのようなものがあります。現在、分割を実行して最初の部分を正常に選択できますが、分割を実行して2番目の部分を選択すると、インデックスが配列エラーの範囲外になります。

var Names = File
            .ReadAllLines(path)
            .Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
            .Select(a => new {
                phoneNbr = a[0].Trim(),
                Name = a[2].Trim().Split(' ')[0],
                Name2 = a[2].Trim().Split(' ')[1], //gives me error I think becuase it already split it
                addr = a[1].Trim()
            })
              .ToList(); 
4

4 に答える 4

2

おそらく、3列目に2つの単語がなく、インデックス2にレコードがあります。2番目の要素を使用する前に、分割後に2つの要素を取得することを確認する必要があります。

変化する

Name2 = a[2].Trim().Split(' ')[1]

Name2 = a[2].Trim().Split(' ').Length > 1 ? a[2].Trim().Split(' ')[1] : ""
于 2012-12-29T16:05:44.923 に答える
2

独自の構造化テキストファイルパーサーをローリングする代わりに、ライブラリを使用してください。

名前Microsoft.VisualBasic.FileIO空間にはTextFileParserクラスが含まれるか、人気のあるFileHelpersのようなサードパーティのライブラリを使用できます。

このようなライブラリは、このようなファイルの解析を処理するときに発生する可能性のある多くの微妙な問題を処理します。

于 2012-12-29T16:05:50.163 に答える
0

正規表現を使用してa[2]を分割できます。

Regex.Split(a[2].Trim(), @"\W+")[0];
Regex.Split(a[2].Trim(), @"\W+")[1];

正規表現分割の例 http://www.dotnetperls.com/regex-split

于 2012-12-29T16:12:38.590 に答える
0

次の構文を試してください

var Names = (from s in File.ReadAllLines(path).Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
        let namestr=s[2].Trim().Split(' ')
        select new {
            phoneNbr = s[0].Trim(),
            Name = namestr.Length >=1 ? namestr[0] :"",
            Name2 = namestr.Length >=2 ? namestr[1] :"", 
            addr = s[1].Trim()
        }).ToList();

名前を 1 回だけ分割し、null 値もチェックします。

于 2012-12-29T16:20:24.597 に答える