如何从文本文件读取更快/更智能?
问题描述:
我想知道是否有可能以更快更智能的方式从text file
中读取。如何从文本文件读取更快/更智能?
这是我的数据在text file
的典型格式:
称之为“部分”:
ID:1;
FIELD1 :someText;
FIELD2 :someText;
FIELD3 :someText;
FIELD4 :someText;
FIELD5 :someText;
FIELD6 :someText;
FIELD7 :someText;
FIELD8 :someText;
END_ID :
01: someData;
02: someData;
...
...
48: someData;
ENDCARD:
我有成千上万的人在一个文本文件中。
是否可以使用LINQ
通过“零件”来读取它的“零件”?我不想循环每一行。
LINQ
有可能在ID:1;
开始并在ENDCARD:
结束?
这样做的原因是,我希望为每一个“部” object
...
我脑子里想的是这样的:
string[] lines = System.IO.File.ReadAllLines(SomeFilePath);
//Cleaning up the text file of unwanted text
var cleanedUpLines = from line in lines
where !line.StartsWith("FIELD1")
&& !line.StartsWith("FIELD5")
&& !line.StartsWith("FIELD8")
select line.Split(':');
//Here i want to LINQtoText "part" by "part"
//This i do not want to do!!!
foreach (string[] line in cleanedUpLines)
{
}
答
在这里你去:
static void Main()
{
foreach(var part in ReadParts("Raw.txt"))
{ // all the fields for the part are available; I'm just showing
// one of them for illustration
Console.WriteLine(part["ID"]);
}
}
static IEnumerable<IDictionary<string,string>> ReadParts(string path)
{
using(var reader = File.OpenText(path))
{
var current = new Dictionary<string, string>();
string line;
while((line = reader.ReadLine()) != null)
{
if(string.IsNullOrWhiteSpace(line)) continue;
if(line.StartsWith("ENDCARD:"))
{
yield return current;
current = new Dictionary<string, string>();
} else
{
var parts = line.Split(':');
current[parts[0].Trim()] = parts[1].Trim().TrimEnd(';');
}
}
if (current.Count > 0) yield return current;
}
}
这是做什么的:创建一个迭代器块(一个状态机读取和“产生”数据,因为它是迭代的;它不会一次读取整个文件)扫描行;如果它是一张卡的结尾,则该卡被“取消”;否则它会将数据添加到字典中进行存储。
注意:如果您有自己的class
表示数据,那么您可以使用反射或FastMember之类的内容来按名称设置值。
这不直接使用LINQ;但是,它的实现为可枚举序列,这是LINQ到对象的构建块,所以你可以消耗这与LINQ,即
var data = ReadParts("some.file").Skip(2).First(x => x["ID"] == "123");
哇,这真的真棒。谢谢马克。 =) – Willem 2012-01-18 08:23:19
我只是想知道如何找到,阅读和回答这个问题10(编辑15分钟)与这样一个干净简洁的答案。 – Oliver 2012-01-18 08:46:21
@Oliver提供了很多LINQ的帮助? – 2012-01-18 09:19:39