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