English 中文(简体)
在C#中找到一组文件中模式的最快方法是什么?
原标题:
  • 时间:2009-04-02 17:43:10
  •  标签:
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;

namespace regex
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      Regex exp = new Regex(@"e(-)?m[a@]il(s)?|input|output|padr(ão|ões)|máquina(s)?|reconhecimento",
                            RegexOptions.IgnoreCase | RegexOptions.Compiled |
                            RegexOptions.Multiline  | RegexOptions.ExplicitCapture);

      for (int filecount = 0 ; filecount < 22 ; filecount++)
      {
        string file = "/home/files/file"+ string.Format("{0:0#}",filecount) + ".txt";
        StreamReader reader = new StreamReader(file);

        string text = reader.ReadToEnd();
        int c=0;

        MatchCollection matchList = exp.Matches(text);
        c = matchList.Count;

        Console.WriteLine("Reading " + file + " -> " + c + " matches");
      }
    }
  }
}

如果我注释掉这一行

c = matchList.Count;

它很快。但我需要知道它找到了多少匹配。

这是最快的方法吗?对于我拥有的文件组,解析每个文件需要14秒。Perl只需1秒钟就可以输出完全相同的信息。

PS:每个文件(文本文件)大约有+/- 1Mb,因此需要处理约20Mb。

谢谢 ;)

问题回答

您可以使用BackgroundWorker并行搜索文件。您需要跟踪计数并在最后进行汇总。您可以为每个文件或一组文件拥有一个BGWorker。4.0 Framework将简化此代码,因为它具有并行数据结构。

可能会对您造成影响的一件事是您留下了文件连接,这增加了一些不必要的开销。

在调用ReadToEnd()之后一定要记得调用reader.Close();

使用

StreamReader reader = new StreamReader(file); 

很危险,它不会关闭你的文件句柄。

使用:

using(Streamreader reader = new StreamReader(file).

确保您的文件句柄已关闭。





相关问题
热门标签