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
答案 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解析添加确保输入返回一个整数,如果你使用这个代码,最好设置一个标志,以防它拾取非整数或者它会被忽视。