【发布时间】:2017-12-29 18:21:07
【问题描述】:
我在下面的 while 语句中逐行从 StreamReader 读取数据。
while (!sr.EndOfStream)
{
string[] rows = sr.ReadLine().Split(sep);
int incr = 0;
foreach (var item in rows)
{
if (item == "NA" | item == "" | item == "NULL" | string.IsNullOrEmpty(item) | string.IsNullOrWhiteSpace(item))
{
rows[incr] = null;
}
++incr;
}
// another logic ...
}
代码运行良好,但由于 csv 文件很大(500,000,000 行和数百列),所以速度很慢。有没有更快的方法来检查数据(如果它是“NA”,“”,......应该用null代替)。目前我正在使用带有 incr 变量的 foreach 来更新 foreach 中的项目。
我想知道 linq 或 lambda 会更快,但我是这些领域的新手。
【问题讨论】:
-
linq 不太可能更快。您可以做的一件小事是摆脱 'item == ""' 检查,因为您已经有了 string.IsNullOrEmpty(item),还有 | IsNullOrEmpty 和 IsNullOrWhitespace 检查之间不会短路更改为 ||。
-
我建议您将数据从 CSV 保存到数据库(根据情况使用关系或 NoSQL),然后使用它。会很快的。
-
什么是
// another logic?循环(for是比foreach更好的选择)应该很快 -
另一个逻辑是SqlBulkCopy部分。但这不是本次任务的目标。
-
您对程序进行了概要分析吗?标题提到了循环内的数据检查,但我认为与从文件中读取并拆分为列(你称之为行)的时间相比,进行检查和更新的时间是微不足道的