有没有一种使用正则表达式快速解析大文件的方法?

2024-01-22

问题: 非常非常大的文件,我需要逐行解析以从每行获取 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 行:

10.10.10.10 - - [27/11/2002:16:46:20 -0500]“获取/solr/HTTP/1.1”200 4926 789


内存映射文件 http://msdn.microsoft.com/en-us/library/dd997372.aspx and 任务并行库 http://msdn.microsoft.com/en-us/library/dd460717.aspx求助。

  1. 创建具有多个随机访问视图的持久 MMF。每个视图对应于文件的特定部分
  2. 定义解析方法,参数如下IEnumerable<string>,基本上是抽象一组未解析的行
  3. 为每个 MMF 视图创建并启动一项 TPL 任务Parse(IEnumerable<string>)作为任务操作
  4. 每个工作任务将解析​​后的数据添加到共享队列中阻塞收集 http://msdn.microsoft.com/en-us/library/dd267312.aspx type
  5. 另一个任务听 BC (GetConsumingEnumerable() http://msdn.microsoft.com/en-us/library/dd395014.aspx)并处理已经由工作任务解析的所有数据

See 管道图案 http://msdn.microsoft.com/en-us/library/ff963548.aspx on MSDN

必须说这个解决方案是为了.NET Framework >=4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种使用正则表达式快速解析大文件的方法? 的相关文章

  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • “编译时分配的内存”到底是什么意思?

    在 C 和 C 等编程语言中 人们经常提到静态和动态内存分配 我理解这个概念 但 所有内存在编译时都被分配 保留 这句话总是让我感到困惑 据我理解 编译是将高级 C C 代码转换为机器语言并输出可执行文件 编译文件中的内存是如何 分配 的
  • elasticsearch 按数组字段的大小进行过滤

    如何过滤包含数组字段且元素数量超过 N 的文档 如何过滤字段为空数组的文档 切面是解决方案吗 如果是这样 怎么办 我想看看脚本过滤器 http www elasticsearch org guide reference query dsl
  • Elasticsearch 集群“master_not_discovered_exception”

    我已经安装了elasticsearch 2 2 3并在2个节点的集群中进行了配置 节点 1 elasticsearch yml cluster name my cluster node name node1 bootstrap mlocka
  • 语音识别在 Unity Hololens 项目中不起作用

    我正在尝试在 Hololens 中创建自己的具有语音识别功能的 Unity 项目 我复制粘贴了来自的说明tutorial https developer microsoft com en us windows holographic hol
  • 查明某个类型是否实现了通用接口

    假设我有一个类型 MyType 我想做以下事情 查明对于某些 T MyType 是否实现了 IList 接口 如果 1 的答案是肯定的 请找出 T 是什么 似乎执行此操作的方法是 GetInterface 但它只能让您按特定名称进行搜索 有
  • Realm android 中的更新语句

    我应该如何在android中使用领域数据库更新已经存在的值 我一直在尝试更新它 但它只是作为新值添加而不覆盖它 更新现有对象及其领域数据库中所有字段的另一种方法是使用以下方法realm copyToRealmOrUpdate Object
  • PHP MYSQL 以阿拉伯语插入数据

    我正在尝试使用 PHP 和 HTML 表单将一些阿拉伯语言数据插入到 MySQL 中 当我将数据插入MYSQL表时 表字段将数据表示为 但是当我使用 PHP 访问相同的数据并将其显示在我的网页中时 它显示了正确的数据 我在用 http eq
  • 取消的任务也显示为已完成

    我正在尝试使用异步等待和取消来对此事有更多的了解 为此 我制作了以下控制台应用程序 using System using System Threading using System Threading Tasks namespace Asy
  • JavaScript 中的点运算符

    我认为点运算符只能应用于对象来访问其属性 IE 例如 var o prop property alert o prop property 当JS执行时alert o prop 第一个包含引用的对象o将进一步发现将找到包含引用的属性o pro
  • 按钮突出显示状态的延迟

    我在两种完全不同的情况下遇到了这个问题 这使得它非常奇怪 情况 一个 UIButton 作为另一个 UIView 的子视图 情况 UIBarButtonItem 在 UIToolBar 中 在这两种情况下 按钮仅在稍有延迟 大约 0 5 1
  • 支持多个版本的 Excel 以从 Access 应用程序实现自动化

    我有一个 Access 应用程序 是在多用户环境中的 Access 2013 中开发的 它使用 Excel 自动化来导出和格式化 Excel 文件 正常的 Office Excel 2013 15 0 参考已完成 并且在 Office 20
  • 随机慢速 Rack::MethodOverride#call on Rails app on Heroku

    环境 红宝石 2 1 2 轨道 4 1 4 Heroku 在 Heroku 上托管的 Rails 应用程序中 有时请求需要很长时间才能执行 它只有 1 的次数或更少 但我们无法弄清楚它发生了什么 我们安装了 newrelic 代理 它说它不
  • 如何将 Spring-Boot-Webflux 应用程序部署到 Tomcat 独立服务器?

    一个普通的 spring web 应用程序可以部署到tomcat独立为war文件如下 SpringBootApplication public class MyApplication extends SpringBootServletIni
  • Symfony 渲染控制器异常模板(“”)

    我试图在树枝内渲染一个控制器 我遵循文档 嵌入其他控制器 我经常使用 render controller 方法获得豁免 渲染模板期间抛出异常 在我的 template html twig 中 render controller MyBund
  • 确定元素在文档上的绝对位置

    我需要确定 HTML 元素的确切屏幕坐标 相对于文档 我已经有执行此操作的代码 将每个父对象的 clientWidth 和 clientHeight 相加到根 但当 jQuery 的滚动效果开始工作时似乎无效 事实上 我需要检测位置的元素是
  • 在 mongodb 的一次更新调用中推送到两个单独的数组

    我正在尝试更新以通过一次更新调用来更新文档中的两个单独的数组 有没有办法做到这一点 例如 如果我有一个类似的文档 id 1 array1 1 array2 4 现在我正在这样做 db collection update id 1 push
  • Oracle SQL技术避免填充trans log

    Oracle 编程新手 来自 Sybase 和 MS SQL Server 避免用大量更新填充事务日志的 Oracle 方式 是什么 在我的具体情况下 我正在更新可能非常大量的行 这是我的方法 UPDATE my table SET a c
  • Django 表已经存在

    这是我的 Django 迁移文件 当我跑步时 python manage py makemigrations migrate 我收到这个错误 Error django db utils OperationalError 1050 Table
  • 将非常大的 Gradle 项目与许多子项目分开的指南,以使 Gradle 构建更快,IntelliJ Gradle 刷新更快

    我有一个相当大的 git 项目 我有一个很大的单个 build gradle 定义子项目 在最初几年 没问题 在最初的几年之后 由于子项目的数量 Gradle 命令行配置步骤变得有点慢 例如 当我运行 gradle 命令时 我看到暂停 gt
  • 有没有一种使用正则表达式快速解析大文件的方法?

    问题 非常非常大的文件 我需要逐行解析以从每行获取 3 个值 一切正常 但解析整个文件需要很长时间 可以在几秒钟内完成此操作吗 通常所需时间为 1 分钟到 2 分钟 示例文件大小为 148 208KB 我使用正则表达式来解析每一行 这是我的