读取一行到一定数量的数据

时间:2016-10-18 12:49:40

标签: c#

我创建一个应用程序,它将读入一个大型数据文件,并从.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个字段。这会有效还是有更简单的方法来完成这个?

由于

2 个答案:

答案 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, ..... });
}

如果需要多次解析,可以创建一个包含每行起始索引的索引文件。