C# 如何从textfile加快这个解析循环

C# 如何从textfile加快这个解析循环,c#,optimization,text-files,C#,Optimization,Text Files,我是一个乞丐,所以我可能错过了一些简单的提示。 我的问题是: 我有一个循环,从文本文件中读取一些数据。 我有160个文件,里面有14000行7个值。 我感兴趣的是,根据datatable中现有列的时间对应关系,只获取这一行的一部分。 如果我找到一个对应的行,我会更新Datatable中的行 文件中的实际代码大约需要6分钟。。。。真的太长了。。。 有没有加快这个循环的想法? 我准备用一个while循环来减少循环 文件示例: 文件示例: Col1 Col2 Col3 Col4 Col5 Col6 1

我是一个乞丐,所以我可能错过了一些简单的提示。 我的问题是:

我有一个循环,从文本文件中读取一些数据。 我有160个文件,里面有14000行7个值。 我感兴趣的是,根据datatable中现有列的时间对应关系,只获取这一行的一部分。 如果我找到一个对应的行,我会更新Datatable中的行

文件中的实际代码大约需要6分钟。。。。真的太长了。。。 有没有加快这个循环的想法? 我准备用一个while循环来减少循环

文件示例: 文件示例:

Col1 Col2 Col3 Col4 Col5 Col6

15943100 118812,492,2875,3

15943200 118812,492,2875,3

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

15943400 118812,502,2875,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;
                }
            }                
        }

尝试清理您的代码,这样您就可以看到森林中的树木。在这样做的过程中,由于更清晰的程序结构,有许多优化显示了它们自己

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;
        }
    }
}

您可以并行处理这些文件,并以异步方式进行数据库更新。这一切都可能节省时间。你有没有设置一些计时器,看看什么东西慢?数据库可能很慢,需要一个索引?我可以要求一个小文件的例子,甚至2行动画。很可能是数据。选择。。。占用了大部分时间,如果我是你,我会用秒表类来测量。我不是在用数据表,而是在用数据表。我猜Select占用了大部分时间,但我不知道如何以不同的方式在我的表中找到对应关系。使用性能分析器查看是否花费了大部分处理时间,然后做出相应反应我无法运行代码,附近有一个错误:foreach var sp1、sp2、vear,毫秒从第行到第行你需要最新版本的C7.2知道为什么我不能在6.0之后使用吗?因为元组是在7.0中引入的。实际上,你不需要7.2,只需要7.0。安装Visual Studio 2017,您将一切正常。现在已经有6个月了。另外,如果你有LINQPad 5+,你可以使用它。所以我尝试了你的解决方案,我终于让它工作了!这不是更有效,我需要450-500毫秒的时间来计算每个相关值!要添加112605个相关值,平均运行15小时左右!无论如何,谢谢你的建议,代码看起来更性感;