我是一个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;
}
}
}
答案 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;
}
}
}