如何从textfile中固定这个解析循环

时间:2017-11-24 10:06:05

标签: c# optimization text-files

我是一个c#begginer所以我可能错过了一些简单的提示。 这是我的问题:

我有一个循环,从文本文件中读取一些数据。 我有160个文件,里面有14000行7个值。 我有兴趣只根据数据表中现有列的时间对应来获取这一行。 如果我发现了一条相应的线,我会在Datatable中更新一行。

实际代码需要大约6分钟的文件....这真的太长了... 有没有想过加快这个循环? 我已经尝试用while循环来减少循环......

档案样本: 文件样本:

Col1 Col2 Col3 Col4 Col5 Col6

15943100 1188 1 2,49 2,28 75,3

15943200 1188 1 2,49 2,28 75,3

15943300 1188 1 2,50 2,28 75,3

15943400 1188 1 2,50 2,28 75,3

这是代码:(编辑Aluan Haddad回答,但不是更快)

 foreach (string FileName in fileFastPath)
        {
           var start = DateTimeOffset.UtcNow;
            var allLines = File.ReadAllLines(FileName);

            foreach (var line in allLines.Where(line => line.Contains("Acquisition depuis")))
            {
                DateTimeOffset.TryParse(line.Split('\t')[1], out start);
            }

            double x = 0, y = 0, z = 0;

            foreach (var (sp1, sp2, vear, milliseconds) in from line in allLines
                                                           where !line.Contains("Acquisition depuis")
                                                           select line.Split('\t') into values
                                                           where values.Length >= 5
                                                           where double.TryParse(values[3], out x)
                                                           where double.TryParse(values[4], out y)
                                                           where double.TryParse(values[5], out z)
                                                           let milliseconds = double.Parse(values[0])
                                                           where milliseconds % 1000 == 0
                                                           select (x, y, z, milliseconds))
            {
                var updatedStart = start + TimeSpan.FromMilliseconds(milliseconds);
                var existingValue = Data
                    .Select($"Time = #{updatedStart: yyyy-MM-dd HH:mm:ss.fff}#")
                    .FirstOrDefault(existing => existing != null);

                if (existingValue != null)
                {
                    existingValue["SP1 Bar"] = sp1;
                    existingValue["SP2 Bar"] = sp2;
                    existingValue["VEAR_POS %"] = vear;
                }
            }                
        }

1 个答案:

答案 0 :(得分:0)

尝试清理代码,以便查看树木的森林。正如您所做的那样,由于更清晰的程序结构,有许多优化可以显示出来。

foreach (var fileName in fileFastPath)
{
    var start = DateTimeOffset.UtcNow;
    var allLines = File.ReadAllLines(fileName);

    foreach (var line in allLines.Where(line => line.Contains("Acquisition depuis")))
    {
        DateTimeOffset.TryParse(line.Split('\t')[1], out start);
    }

    double x = 0, y = 0, z = 0;

    var lineValues = from line in allLines
                     where !line.Contains("Acquisition depuis")
                     select line.Split('\t') into values
                     where double.TryParse(values[3], out x)
                     where double.TryParse(values[4], out y)
                     where double.TryParse(values[5], out z)
                     let milliseconds = double.Parse(values[0])
                     select (x, y, z, milliseconds);

    foreach (var (sp1, sp2, vear, milliseconds) in lineValues)
    {
        var updatedStart = start + TimeSpan.FromMilliseconds(milliseconds);
        var existingValue = Data
            .Select($"Time = #{updatedStart: yyyy-MM-dd HH:mm:ss.fff}#")
            .FirstOrDefault(existing => existing != null);

        if (existingValue != null)
        {
            existingValue["SP1 Bar"] = sp1;
            existingValue["SP2 Bar"] = sp2;
            existingValue["VEAR_POS %"] = vear;
        }
    }
}