使用linq到txt解析行

时间:2010-02-02 06:56:37

标签: c# linq parsing file-io

var t1 = from line in File.ReadAllLines(@"alkahf.txt")
                     let item = line.Split(new string[] {". "}, StringSplitOptions.RemoveEmptyEntries)
                     let verse = line.Split(new string[] { "\n. " }, StringSplitOptions.RemoveEmptyEntries)
                     select new
                     {
                         Index = item,
                         Text = verse
                     };

遇到上述代码的问题我不确定如何正确解析这些行。

文件的格式是这样的,我也想忽略任何空行     StringSplitOptions.RemoveEmptyEntries由于某种原因不起作用

1. This is text it might have numbers

2. I skipped a line

2 个答案:

答案 0 :(得分:2)

在LINQ部分,你里面一行,所以你可能想先排除空行:

from line in File.ReadAllLines(@"alkahf.txt")
where !string.IsNullOrEmpty(line)

然后你做两个分裂 - 一个在换行,这是奇怪的(因为那不会在那里,因为我们知道我们正在读行)。我期待你的意思是:

let parts = line.Split('.')
where parts.Length == 2
select new {
    Index = parts[0],
    Text = parts[1]
};

另外,请注意ReadAllLines是一个缓冲操作;如果你想要真正的流媒体,你可能想要这样的东西:

public static IEnumerable<string> ReadLines(string path) {
    using(var reader = File.OpenText(path)) {
        string line;
        while((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}

不缓冲(您不会立即加载整个文件)。只需将第一行更改为:

from line in ReadLines(@"alkahf.txt")

答案 1 :(得分:0)

感谢Marc's answer我修复了我的问题。对于迟到的回复我很抱歉,我正在将其作为一个个人项目。

代码是这样的

 var t1 = from line in StreamReaderExtension.ReadLinesFromFile(@"alkahf.txt")
          let parts = line.Split(new string[]{". "}, 
              StringSplitOptions.RemoveEmptyEntries)
          where !string.IsNullOrEmpty(line)                     
              && int.Parse(parts[0].ToString()).ToString() != ""
          select new
          {
              Index = parts[0],
              Text = parts[1]
          };

int解析添加确保输入返回一个整数,如果你使用这个代码,最好设置一个标志,以防它拾取非整数或者它会被忽视。