问题:
非常非常大的文件,我需要逐行解析以从每行中获取3个值。一切正常,但解析整个文件需要很长时间。有可能在几秒钟内完成此操作吗?典型的时间是在1分钟到2分钟之间。

示例文件大小为148,208KB

我正在使用正则表达式来解析每一行:

这是我的C#代码:

private static void ReadTheLines(int max, Responder rp, string inputFile)
{
    List<int> rate = new List<int>();
    double counter = 1;
    try
    {
        using (var sr = new StreamReader(inputFile, Encoding.UTF8, true, 1024))
        {
            string line;
            Console.WriteLine("Reading....");
            while ((line = sr.ReadLine()) != null)
            {
                if (counter <= max)
                {
                    counter++;
                    rate = rp.GetRateLine(line);
                }
                else if (max == 0)
                {
                    counter++;
                    rate = rp.GetRateLine(line);
                }
            }
            rp.GetRate(rate);
            Console.ReadLine();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
}

这是我的正则表达式:
public List<int> GetRateLine(string justALine)
{
    const string reg = @"^\d{1,}.+\[(.*)\s[\-]\d{1,}].+GET.*HTTP.*\d{3}[\s](\d{1,})[\s](\d{1,})$";
    Match match = Regex.Match(justALine, reg,
                                RegexOptions.IgnoreCase);

    // Here we check the Match instance.
    if (match.Success)
    {
        // Finally, we get the Group value and display it.

        string theRate = match.Groups[3].Value;
        Ratestorage.Add(Convert.ToInt32(theRate));
    }
    else
    {
        Ratestorage.Add(0);
    }
    return Ratestorage;
}

这是要解析的示例行,通常大约为200,000行:

最佳答案

Memory Mapped FilesTask Parallel Library寻求帮助。

  • 创建具有多个随机访问 View 的持久MMF。每个 View 对应于文件
  • 的特定部分
  • 使用像IEnumerable<string>这样的参数定义解析方法,基本上是抽象一组未解析的行
  • 每一个MMF View 创建并启动一个TPL任务,并将Parse(IEnumerable<string>)作为任务 Action
  • 每个工作任务都将已解析的数据添加到BlockingCollection类型
  • 的共享队列中
  • 另一个Task监听BC(GetConsumingEnumerable())并处理工作任务Task
  • 已经解析的所有数据

    在MSDN上查看Pipelines pattern

    必须说此解决方案适用于.NET Framework >=4

    关于c# - 有没有一种使用正则表达式解析大型文件的快速方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13810693/

    10-17 03:08