我创建一个应用程序,它将读入一个大型数据文件,并从.dat文件中的每一行返回特定的文本选择。请参阅下面的数据示例。
22/06/2016 22:18:21.209 Type6 -92.31435 2.06424 0.07686
22/06/2016 22:18:21.210 Type34 -91.4085 1.84464 -0.09333
我需要前3组数据,即日期,时间和类型。类型之后的值会持续一段时间,并且我需要从中收集大量的行。我想过只拆分线的每个部分并取前3个字段。这会有效还是有更简单的方法来完成这个?
由于
答案 0 :(得分:1)
你是正确的方式(只提取三个字段);我建议在上下文中使用 Linq ,例如
var source = File
.ReadLines(@"C:\MyData.dat")
.Select(line => line.Split(new char[] { ' ' }, 4))
.Where(items => items.Length >= 3) // it seems that you have empty lines or something
.Select(items => new {
// Let's combine date and time into DateTime
date = DateTime.ParseExact(items[0] + " " + items[1],
@"dd/MM/yyyy H:m:s.fff",
CultureInfo.InvariantCulture),
kind = items[2] });
// .ToArray(); // you may want add materialization (i.e. read once and put into array)
获得此Linq查询后,您可以轻松地过滤掉,代表您想要的数据,例如
var test = source
.Where(item => item.date > DateTime.Now.AddDays(-3)) // let's have fresh records only
.OrderByDescending(item => item.date)
.Select(item => $"{item.date} {item.kind}");
Console.Write(string.Join(Environment.NewLine, test));
答案 1 :(得分:0)
你可以做一些事只是为了读取每一行的第一个字符,但是行的长度没有在任何地方指定,所以你必须阅读所有的数据。
您应该使用File.ReadLines(path)
,因为它会延迟加载数据。这只会在每次迭代时加载一行。 Foreach行你应该检查你需要什么数据并保存在你喜欢的任何数据上......
var relevantData = new List<T>();
foreach(var line in File.ReadLines(path))
{
// parse the data you need.
relevantData.Add( new T { Date = whatever, ..... });
}
如果需要多次解析,可以创建一个包含每行起始索引的索引文件。