在csv文件的列中搜索值

问题描述:

我有一个csv文件,有2列,IDFlag。有很多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; 
}