在csv文件的列中搜索值
问题描述:
我有一个csv文件,有2列,ID
和Flag
。有很多Flag
值,但有一些表示错误的东西 - 错误,失败等。我需要做的是相当简单 - 搜索Flag
列,看看这些值中的任何一个是否在“Bad Flags”组中。在csv文件的列中搜索值
我有以下代码,做我所需要的 - 检查标志文件是否存在,遍历每行,将其拆分,然后检查当前行是否有标志元素,然后检查标志是否在我的坏组 - 如果我发现连一个我做:
private bool CheckFlagStatus(string directory)
{
// Bad flags
const int Flag1 = 1;
const int Flag2 = 5;
const int Flag3 = 6;
const int Flag4 = 42;
const int Flag5 = 61;
bool isGood = true;
string flagFilePath= Path.Combine(directory, "flags.csv");
if (File.Exists(flagFilePath))
{
using (StreamReader reader = new StreamReader(flagFilePath))
{
string line;
while (!string.IsNullOrEmpty(line = reader.ReadLine()))
{
var splitval = line.Split(',');
if (splitval.Length == 2)
{
var flagString = splitval[1];
int flag;
bool parsed = Int32.TryParse(flagString, out flag);
if (parsed)
{
if (flag == Flag1 || flag == Flag2 || flag == Flag3
|| flag == Flag4 || flag == Flag5)
{
isGood = false;
break;
}
}
}
}
}
}
return isGood;
}
虽然这个作品,这是一个非常线性的强力方法。虽然有20行的flags.csv文件是完美的,但如果有一百万行会发生什么?我想知道如何使这更优雅或优化它有什么建议。
答
这已经过优化。如果有一百万行需要更长的时间,但性能是线性的,比大多数算法好得多。你可以让你的代码更优雅,但这只是一个样式问题,并且与你实际做的或者它的最优化无关。请记住,优化的代码通常比较冗长。
通过做一些像File.ReadLines
然后拆分一个新行然后拆分,
然后遍历列表只查看奇怪的索引你的代码可能会更优雅(少线),但性能不会更好。事实上,它可能会更糟。
答
你的代码是好的,它是这样的检查每一行,我只是尽量让你的代码更易读使用LINQ和Readlines
方法:
private bool CheckFlagStatus(string directory)
{
badFlags = new[] { 1, 5, 6, 42, 61};
string flagFilePath = Path.Combine(directory, "flags.csv");
if (File.Exists(flagFilePath))
{
var lines = File.ReadLines(flagFilePath)
.Where(line => !string.IsNullOrEmpty(line));
foreach (var line in lines)
{
var splitval = line.Split(',');
if (splitval.Length == 2)
{
var flagString = splitval.Last();
int flag;
if (int.TryParse(flagString, out flag))
{
if (badFlags.Contains(flag)) return false;
}
}
}
}
return true;
}