我有一个看起来像这样的文本文件,我在每个'|'分开。 在第3个'|'之间是两个单词,我需要分成两个单独的列。无法进行拆分。
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();
答案 0 :(得分:2)
你可能在第三列中没有两个单词,索引2有一些记录。在使用第二个元素之前,你需要在分割后得到两个元素。
更改
Name2 = a[2].Trim().Split(' ')[1]
到的
Name2 = a[2].Trim().Split(' ').Length > 1 ? a[2].Trim().Split(' ')[1] : ""
答案 1 :(得分:2)
不要滚动自己的结构化文本文件解析器,而是使用库。
Microsoft.VisualBasic.FileIO
命名空间包含TextFileParser
课程,或者您可以使用受欢迎的FileHelpers等第三方库。
这些库处理许多在处理解析此类文件时可能出现的微妙问题。
答案 2 :(得分:0)
您可以使用正则表达式分割[2]。
Regex.Split(a[2].Trim(), @"\W+")[0];
Regex.Split(a[2].Trim(), @"\W+")[1];
正则表达式拆分示例 http://www.dotnetperls.com/regex-split
答案 3 :(得分: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();
它只拆分一次名称,并检查空值。