`
datamachine
  • 浏览: 157043 次
社区版块
存档分类
最新评论

大文本文件的字符匹配处理办法

阅读更多

在进行文本处理时,经常会遇到对大文件进行字符串匹配情况。用命令行的grep\cat命令处理此类问题时,写法很简单,但效率太低,用高级语言处理此类问题虽然可以获得较高的运行效率,但代码编写复杂度却相当高。

集算器支持大文件字符串匹配和多线程并行计算,代码简洁性能优异,下面通过例子来看一下具体作法。

 

文件file1.txt存储着大量的字符串,现在需要找出以”.txt”结尾的行数据,并输出到result.txt中。部分源数据如下:



 集算器代码:


    
A1:以游标的形式打开文件。函数cursor并不会将数据全部读入内存,而是以游标(流)的方式打开文件,因此不会占据内存空间。函数cursor使用了默认参数,即:以tab为列分割符读入全部的字段,自动命名为_1_2_3…_n。对于本案例来说,只有一个字段_1

A2=A1.select(like@c(_1,"*.txt"))

这句代码用来查询出游标A1里以“.txt”结尾的行数据。函数select执行查询,函数like进行字符串匹配,其中_1表示第一个字段。函数like还使用了选项@c,这表示匹配时不区分大小写。

值得注意的是,A2的运算结果是游标,仍然不会占据内存空间。只有遇到export/fetch/groups等函数时,集算器引擎才会分配合适的内存缓冲区,并将前面的游标计算自动转化为内存计算。。

A3=file("e:\\result.txt").export(A2),这句代码将最终计算结果写入文件。部分数据如下:



   上面的匹配规则比较简单,如果遇到复杂的情况,那就需要使用正则表达式。比如:找出以“c:\windows”开头,且结尾名不是“.txt”的行数据。

函数regex可以进行正则表达式匹配,只需将A2改为:

         A1.regex@c("^c:\\\\windows.*(?<!\\\\(.txt)$)")

上面代码中,选项@c表示不区分大小写。

 

正则表达式虽然可以实现更复杂的匹配规则,但性能偏低,比如从2.13G的文件中找出以“.txt”结尾的行数据,在同样环境下测试,用正则表达式需要206秒,用普通表达式(select)只需要119秒。

事实上,普通表达式也可以实现很多逻辑较复杂的匹配规则,而且语法更加直观,学习成本更低。比如emp.txt存储着大量的用户信息,每条用户信息分为多个字段,字段之间用tab分割,第一行是字段名。现在要找出符合下列条件的数据:EId字段在100以内,Name字段的首字母是aBirthday字段大于1984-01-01。集算器代码如下:



 

函数cursor的选项@t表示将第一行读为列名,之后就可以使用列名来访问数据。

查询条件是三个,可以分别用EId>100like@c(Name,"a*")Birthday>=date("1984-01-01")来表示,条件之间是“与”的逻辑关系,可以用&&来表示。

 

前面的算法是串行,改成并行可以进一步提高性能,具体做法是用多个线程并行读取文件,每个线程都用游标访问文件的一部分,并同时进行集合计算,最后再将每个游标的结果合并。

在相同的硬件环境下对2.13G的大文进行测试,串行时平均耗时119秒,并行时平均耗时56秒,性能提高一倍左右。例子中的算法复杂度较低,瓶颈会产生在硬盘读取上,如果进一步加大运算的复杂度,性能提升的幅度将会更大。

集算器并行计算的代码如下:



 

A1=4A1是分段数量,即将文件分成4段。分段数量,也就是实际执行时的并行数,一般不要超过CPU的核数,否则会形成排队等待,并不能提高性能。实际使用最大并行数量可以在选项中配置。

A2=A1.(file("e:\\file1.txt").cursor@z(;, ~:A1))

上面的代码按照分段数量生成4个游标。其中A1.(express)表示按照括号内的表达式依次计算A1的成员,括号内可用“~”来表示当前成员。A1一般是集合,比如["file1", " file2"][2,3]A1如果是从1开始的连续数字,比如[1,2,3,4],则可以简写成4.( express),案例中的代码就是这种情况。

括号内的表达式是file("e:\\file1.txt").cursor@z(;, ~:A1),其中函数cursor使用了选项@z,这表示将文件分段,用游标取其中的某一段。~:A1表示文件会被大致分为4(A1=4),当前取第~段。“~”是A1的当前成员,因此每个游标依次对应第1、第2、第3、第4段文件。

另外,之所以是“大致分”,是因为精确分会出现半行数据的情况,而集算器会去头补位,自动取出整行数据。

A3=A2.(~.select(like@c(_1,"*.txt")))这句代码针对A2中的每个游标(即~)进行计算,求出游标中符合条件的行数据。这里的计算结果仍然是四个游标。

A4=A3.conj@xm()这句代码将A3中的多个游标进行并行合并。

A5=file("e:\\result.txt”).export(A4),将最终计算结果输出到文件中。

 

集算器脚本不仅能在IDE中独立运行,也可以通过JDBC接口被JAVA程序调用,用法和普通数据库没有区别。单步的计算脚本还可以直接嵌入JAVA代码中,而无需脚本文件。比如前面的A1-A5是分步计算,其实可以合为一步:file("e:\\result.txt").export(4.(file("e:\\file1.txt").cursor@z(;, ~:4)).(~.select(like@c(_1, "*.txt"))).conj@xm())

在操作系统命令行也可以直接运行这种单步脚本,具体内容请参考相关文档。

  • 大小: 29 KB
  • 大小: 14.8 KB
  • 大小: 49.9 KB
  • 大小: 24.7 KB
  • 大小: 24 KB
0
2
分享到:
评论

相关推荐

    C#中文文本匹配,字符串匹配,中文词语匹配,计算2个句子相似度

    中文匹配C#中文文本匹配,字符串匹配,中文词语匹配,计算2个句子相似度 C#中文文本匹配,字符串匹配,中文词语匹配,计算多个句子相似度 C#中文文本匹配,字符串匹配,中文词语匹配,计算2个句子相似度 C#中文文本...

    文本字符替换工具

    文本替换专家,使用简单,功能强大,支持多级目录同时替换,支持大小写匹配,支持文件备份,支持文件查找,智能历史替换方案记录以及智能备份文件批量还原系统,让文本查找、批量查找、替换、批量替换、重复查找替换...

    用c++实现在一个txt文件中查找字符

    用c++实现在一个txt文件中查找字符,算法就是字符串匹配,没什么技巧性,最后还给出了运行时间,适合初学者参考

    字符串匹配算法_朴素字符串匹配算法

    一般而言文本就是要编辑的文档,而模式字符串往往由用户来指定,高效的字符串匹配 算法可以提高程序的响应性能,当然字符串匹配算法的应用远远不止于此,例如在生物计算科学中查找特定的DNA序列,也是字符串匹配算法...

    Go-一个简单而快速的Go库用于将输入字符串模糊匹配到目标字符串列表

    一个简单而快速的Go库,用于将输入字符串模糊匹配到目标字符串列表

    kettle 根据系统时间加正则表达式动态匹配获取多个文本文件

    kettle 根据系统时间加正则表达式动态匹配获取多个文本文件

    C#实现闹钟功能,字符串截取、匹配,对文本文件的stream流操作

    C#实现闹钟功能,字符串截取、匹配,对文本文件的stream流操作,用文本来保存用户的记录,截取其中的字符串来判断时间是否已经到和截取记录中的用户提示信息和音乐地址等。暂时不会解决内存的释放问题,导致运行的...

    linux文本处理三剑客.txt

    grep命令选项 --color=auto:对匹配到的文本着色显示 -v:反向选择 -i:忽略字符大小写 -n:显示匹配的行号 -c:统计匹配的行数 -o:仅显示匹配到的字符串 -q:静默模式,不输出任何信息 ...-f file:根据模式文件处理

    Delphi开发技巧之-字符串

    以模式匹配比较字符串 使用associative arrays 使用Pos函数递归搜索 分离文本为字 分解字符串 加密口令 加密解密字符串 取URL中的文件名 取字符串中的字符排列 在 Case 语句中使用字符串 在Delphi中使用正规表达式 ...

    在文本中查找替换字符串程序

    在txt文本中,查找和替换指定的字符串,并另存文件.

    数据结构括号匹配程序c语言

    数据结构括号匹配程序c语言试验程序,实现括号自动匹配,支持文件操作20字符以内文件名。

    基础汇编程序(4)查找字符串中的指定字符

    用串操作指令设计程序,实现在指定存储区(长度:100H)中寻找指定的匹配字符,当遇空格字符(20H)便结束,并显示查找结果,如提示“找到”或“未找到”。 要求:欲查找的指定字符从键盘输入。

    18.C#字符串和正则表达式参考手册 影印版

    第1章 系统处理文本的方式 1 1.1 .NET Framework 1 1.1.1 公共语言运行时 2 1.1.2 .NET Framework类库 3 1.2 文本是一种数据类型 4 1.2.1 C#的数据类型 5 1.2.2 字符和字符集 6 1.2.3 字符串数据类型 10 1.3 文本...

    全能字符串批量替换机7.0.rar

    全能字符串替换机用于对文件进行替换、查找、抽取、改名、内码...除了文本文件,甚至还支持在office文档中替换和查找; 可以说,本软件在类似软件中,功能的独特和强大达到了很高的程度,希望成为您手头一款常用工具

    模式匹配算法设计

    要求编写建立一个文本文件,每个单词不包括空格且不跨行,单词由字符序列构成,且区分大小写; 统计给定单词在文本中出现的总次数; 检索出某个单词在文本中的行号、在该行中出现的次数及位置。

    全能字符串替换机7.0无限制版

    全能字符串替换机用于对文件进行替换、查找、抽取、改名、内码...除了文本文件,甚至还支持在office文档中替换和查找;可以说,本软件在类似软件中,功能的独特和强大达到了很高的程度,希望成为您手头一款常用工具。

    shell编程-文本文件处理(grep sed awk文本三剑客)

    以一串字符作为表达式向系统传达意思(过滤匹配数据),元字符是描述字符的字符,正则表达式是有一串字符和元字符构成的字符串,主要功能为文本查询和字符串操作,匹配文本 大部分linux只支持基本的正则表达式。 hel...

    正则表达式教程之匹配一组字符详解

    在上一篇《正则表达式教程之匹配单个字符详解》中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt。如果还有一个文件是cal.txt,那么也将会被匹配到。如果只想要匹配na或sa开头的文件,该...

    文件批量处理百宝箱 v10.0 Build 20160223.zip

    文件批量处理百宝箱提供了几十种功能丰富强大的文件批量更名功能,以及支持世界各国语言的源匹配多国语言版批量更名功能。文件批量处理百宝箱能够对 图片压大小缩尺寸,按指定大小或尺寸压缩图片,图片转灰度,MP3...

    令人敬畏的语义匹配神经模型:精选的神经文本(语义)匹配论文列表

    很棒的语义匹配神经模型MatchZoo团队... 代表性的匹配任务如下: 任务源文本目标文字询问文件(标题/内容)题问题/答案字符串1 字符串2前提假设语境/话语响应健康检查pip3 install - r requirements . txtpython3 hea

Global site tag (gtag.js) - Google Analytics