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

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

阅读更多

在进行文本处理时,经常会遇到对大文件进行字符串匹配情况。用命令行的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#中文文本...

    KMP中文字符匹配算法的C++实现

    - 当i和j都不越界且模式串第j个字符与文本串第i个字符匹配时,i和j都向前移动一位。 - 如果不匹配,根据部分匹配表,将j退回到表中对应的位置,然后i保持不变,继续比较下一个字符。 3. **处理多字节字符**:在...

    文本文件字符批量替换工具

    《文本文件字符批量替换工具深度解析》 在IT领域,字符串处理是一项基础且重要的技能,尤其是在文本处理、数据清洗和编程语言中。本篇文章将详细探讨一个名为“文本文件字符批量替换工具”的实用程序,该工具的核心...

    带通配符的字符串匹配算法

    在IT领域,字符串匹配是计算机科学中的一个基本问题,尤其在文本处理、数据搜索和模式识别等场景中广泛应用。带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),...

    搜索一个文本文件字符串

    在IT领域,文本文件处理是一项基础且重要的任务...总之,搜索文本文件中的字符串涉及到了基础的文件操作、字符串匹配算法以及可能的优化策略。理解和掌握这些知识点,对于日常的编程工作或是数据分析任务都非常有帮助。

    易语言文本实现匹配通配符

    4. **特殊处理**:处理特殊情况,如星号连续出现或出现在字符串开头、结尾,以及如何处理文本中的特殊字符等。 5. **返回匹配结果**:根据比较结果,决定返回真(匹配成功)或假(匹配失败)。 以下是一个简单的...

    字符串匹配的c程序

    在IT领域,字符串匹配是计算机科学中的一个基本概念,尤其在文本处理、搜索算法和模式识别中占有重要地位。在这个“字符串匹配的C程序”中,我们主要关注如何使用C语言来实现这一功能。C语言是一种强大的编程语言,...

    字符串匹配

    字符串匹配是计算机科学中一个基础且重要的问题,它在文本处理、搜索引擎、生物信息学等领域都有广泛应用。在汇编语言中实现字符串匹配,虽然比高级语言更为底层和复杂,但也能提供更高的性能优化可能性。 首先,...

    依次遍历所有txt文件,匹配字符串并输出匹配结果

    标题提到的“依次遍历所有txt文件,匹配字符串并输出匹配结果”是一个典型的文本处理应用场景,它涉及到文件操作、字符串处理和循环控制等基本编程概念。这里我们将深入探讨这些知识点。 首先,**文件操作**是程序...

    查找替换多个文本文件中的文本字符串工具软件

    "查找替换多个文本文件中的文本字符串工具软件"就是针对这一需求设计的专业应用,它可以帮助用户高效地处理大量的文本文件,批量进行查找和替换操作,极大地提高了工作效率。 首先,我们要理解这个工具的核心功能。...

    汇编语言-字符串匹配

    字符串匹配是计算机科学中一个基础但至关重要的问题,广泛应用于文本处理、搜索引擎、数据安全等领域。在汇编语言中实现字符串匹配,能帮助我们深入理解底层运算机制,提高程序执行效率。 首先,我们需要了解字符串...

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

    在文本处理领域,模糊匹配是一种常用的技术,允许用户在不完全精确的输入条件下找到最接近的匹配结果。 在Go语言中,这种库可能采用了多种算法来实现这一功能,如Levenshtein距离、Jaccard相似度、Soundex编码或...

    字符匹配后缀自动机

    描述:“字符匹配后缀自动机”这一主题涉及计算机科学中的模式识别与字符串处理技术,特别关注后缀自动机在高效查找文本中特定模式的应用。 知识点详述: 1. **后缀自动机简介**: - 后缀自动机是一种特殊的有限...

    多文本内字符串查找程序

    虽然简单,但效率较低,尤其是当文本文件很大时。 2. **KMP(Knuth-Morris-Pratt)算法**:这是一种改进的字符串匹配算法,避免了不必要的字符比较,提高了效率。它通过构建失败函数来跳过已知不匹配的部分。 3. *...

    从文本文件中查找字符串

    在IT行业中,文本文件的处理是一项基础且重要的任务,特别是在软件开发、数据分析和日志分析等领域。本主题聚焦于“从文本文件中查找字符串”,这是一个常见的需求,例如在源代码中寻找特定函数或变量,或者在日志...

    文件中字符串匹配算法C语言版

    在IT领域,字符串匹配算法是计算机科学中一个基础且重要的概念,特别是在文本处理、搜索引擎和数据挖掘等应用中。本项目关注的是一个C语言实现的文件中字符串匹配算法,其核心目标是读取名为"input.txt"的文件,根据...

    文本字符批量替换

    1. **正则表达式(Regular Expression)**:正则表达式是批量替换的核心工具,它是一种强大的文本处理模式,能匹配和提取复杂模式的字符串。例如,我们可以用正则表达式来匹配所有的数字、字母或特定的特殊符号,并...

    中文文本相似度匹配算法

    中文文本相似度匹配在信息技术领域是一项重要的任务,特别是在搜索引擎、推荐系统、文本分类以及信息检索中扮演着关键角色。本文将深入探讨其中两种常见的技术:simHash算法和海明距离,以及它们在中文文本处理中的...

    mubanpipei.zip_matlab 自动 匹配_matlab 自动匹配_字符匹配_字符模板_字符识别

    在IT领域,尤其是在图像处理和计算机视觉中,字符匹配是一项重要的技术,用于识别和解析文本。本项目"mubanpipei.zip"提供了一个基于MATLAB的字符模板自动匹配解决方案,它可以帮助用户自动识别和匹配图像中的特定...

    Horspool字符串匹配输入增强技术

    在计算机科学中,字符串匹配是一个重要的算法问题,广泛应用于文本处理、搜索引擎、病毒扫描等领域。Horspool字符串匹配算法是一种高效的线性时间复杂度的字符串查找算法,由Brian W. Horspool在1980年提出。本实验...

Global site tag (gtag.js) - Google Analytics