1

我有一个看起来像这样的文本文件,我在每个“|”处进行拆分。在第三个'|'之间 是我需要分成两个单独的列的两个词。拆分时遇到问题。

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

我有类似的东西正在做拆分并将输出写入列表。目前我可以进行拆分并很好地选择第一部分,但是当我进行拆分并选择第二部分时,我得到的索引超出了数组错误的范围。

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

您可能在第三列中没有两个单词,索引为 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命名空间包含类,或者您可以使用流行的FileHelpersTextFileParser等第三方库。

此类库负责处理解析此类文件时可能出现的许多微妙问题。

于 2012-12-29T16:05:50.163 回答
0

您可以使用 Regex 拆分 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();

它只拆分 name 一次并检查空值。

于 2012-12-29T16:20:24.597 回答