热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:如何在不在C#中逐行搜索字符串的大文本文件中搜索?分享

如何在不在C#中逐行搜索字符串的大文本文件中搜索?我有一个大文本文件,我需要搜索特定的字符串。如果没有逐行阅读,有没有快速的方法呢?由于文件的大小(超过100MB),此方法非常慢。

如何在不在C#中逐行搜索字符串的大文本文件中搜索?

我有一个大文本文件,我需要搜索特定的字符串。 如果没有逐行阅读,有没有快速的方法呢?

由于文件的大小(超过100 MB),此方法非常慢。

鉴于文件的大小,你真的想要事先将它们完全读入内存吗? 逐行可能是最好的方法。

这是我的解决方案,它使用流一次读取一个字符。 我创建了一个自定义类,一次搜索一个字符的值,直到找到整个值。

我使用保存在网络驱动器上的100MB文件运行了一些测试,速度完全取决于它在文件中读取的速度。 如果文件在Windows中缓存,则搜索整个文件的时间不到3秒。 否则可能需要7秒到60秒,具体取决于网络速度。

如果针对内存中的String运行并且没有匹配的字符,则搜索本身花费的时间不到一秒。 如果发现许多主要字符与搜索相匹配可能需要更长时间。

public static int FindInFile(string fileName, string value) { // returns complement of number of characters in file if not found // else returns index where value found int index = 0; using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName)) { if (String.IsNullOrEmpty(value)) return 0; StringSearch valueSearch = new StringSearch(value); int readChar; while ((readChar = reader.Read()) >= 0) { ++index; if (valueSearch.Found(readChar)) return index - value.Length; } } return ~index; } public class StringSearch { // Call Found one character at a time until string found private readonly string value; private readonly List indexList = new List(); public StringSearch(string value) { this.value = value; } public bool Found(int nextChar) { for (int index = 0; index  

在所有情况下,您都必须检查所有文件。

查找Rabin-Karp字符串搜索或类似。

最快的搜索方法是Boyer-Moore算法 。 此方法不需要从文件中读取所有字节,但需要随机访问字节。 而且,该方法实现简单。

您的项目是否需要每次都搜索不同的文件以查找相同或不同的字符串,或者每次搜索同一文件中的不同字符串?

如果是后者,您可以构建文件的索引。 但如果文件经常更改,那么这样做是没有意义的,因为构建索引会很昂贵。

要索引文件以进行全文搜索,可以使用Lucene.NET库。

http://incubator.apache.org/lucene.net/

您应该能够通过匹配搜索字符串中每个字符的字符来读取文件字符,直到您到达搜索字符串的末尾,在这种情况下您将匹配。 如果您在任何时候阅读的字符与您要查找的字符不匹配,请将匹配的计数重置为0并重新开始。 例如(****伪代码/未测试****):

 byte[] lookingFor = System.Text.Encoding.UTF8.GetBytes("hello world"); int index = 0; int position = 0; bool matchFound = false; using (FileStream fileStream = new FileStream(fileName, FileMode.Open)) { while (fileStream.ReadByte() == lookingFor[index]) { index++; if (index == lookingFor.length) { matchFound = true; position = File.position - lookingFor.length; break; } } } 

这是您可以使用的众多算法之一(尽管它可能会被一个长度检查关闭)。 它只会找到第一个匹配项,因此您可能希望将while循环包装在另一个循环中以查找多个匹配项。

另外,有关逐行读取文件的注意事项是,如果要匹配的所需字符串跨越行,则不会找到它。 如果那很好,那么你可以逐行搜索,但如果你需要搜索字符串来跨越行,你会想要使用像我上面详述的算法。

最后,如果您正在寻找最佳速度,听起来就像您一样,您将需要迁移上面的代码以使用StreamReader或其他缓冲读取器。

正如Wayne Cornish所说:逐行阅读可能是最好的方法。

如果您将整个文件读取为字符串然后使用正则表达式进行搜索,则它可能更优雅,但您将创建一个大型字符串对象。

这些类型的对象可能会导致问题,因为它们将存储在大对象堆(LOH,对于85.000字节以上的对象)上。 如果您解析许多这些大文件并且内存有限(x86),则可能会遇到LOH碎片问题。

=>如果解析许多大文件,请逐行阅读!

这是一个简单的单function解决方案,逐字逐句阅读。 为我工作得很好。

 ///  /// Find  in . ///  /// The  to find  in. /// The string to find. /// Position within  where  starts or -1 if not found. /// When  is null. /// When  is null or empty. public int FindString(TextReader reader, string toFind) { if(reader == null) throw new ArgumentNullException("reader"); if(string.IsNullOrEmpty(toFind)) throw new ArgumentException("String to find may not be null or empty."); int charsRead = -1; int pos = 0; int chr; do { charsRead++; chr = reader.Read(); pos = chr == toFind[pos] ? pos + 1 : 0; } while(chr >= 0 && pos  

希望有所帮助。

您可以一次将大量数据从文件缓冲到内存中,直到您希望的任何约束,然后在其中搜索字符串。

这样可以减少文件上的读取次数,并且可能是一种更快的方法,但如果将缓冲区大小设置得太高,则更多的是内存耗尽。

如果要加快逐行读取速度,可以创建基于队列的应用程序:
一个线程读取行并将它们加入线程安全队列。 然后第二个可以处理字符串

我有一个大文本文件,我需要搜索特定的字符串。 如果没有逐行阅读,有没有快速的方法呢?

避免在整个文件中搜索的唯一方法是预先对输入进行排序或组织。 例如,如果这是一个XML文件,并且您需要执行许多这些搜索,那么将XML文件解析为DOM树是有意义的。 或者,如果这是一个单词列表,并且您正在查找以字母“aero”开头的所有单词,那么如果您对同一文件进行大量搜索,则首先对整个输入进行排序可能是有意义的。

如果你只是寻找一个特定的字符串,我会说逐行是最好和最有效的机制。 另一方面,如果您要查找多个字符串,特别是在应用程序中的几个不同点,您可能需要查看Lucene.Net以创建索引,然后查询索引。 如果这是一次性运行(即,您以后不需要再次查询同一文件),则可以在临时文件中创建索引,该文件将由系统自动清理(通常是启动时间;或者您可以在程序退出时自行删除)。 如果您需要稍后再次搜索同一文件,则可以将索引保存在已知位置,并在第二次获得更好的性能。

将其粘贴到SQL Server 2005/2008中并使用其全文搜索function。

这里的速度问题很可能是在执行搜索之前将文件加载到内存中所需的速度。 尝试分析您的应用程序以查看瓶颈所在。 如果它正在加载文件,您可以尝试“分块”文件加载,以便文件以小块的forms流式传输,并且每个块都在其上执行搜索。

显然,如果要找到的字符串部分位于文件的末尾,则不会有性能提升。

上述就是C#学习教程:如何在不在C#中逐行搜索字符串的大文本文件中搜索?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记


推荐阅读
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 本文介绍了Foundation框架中一些常用的结构体和类,包括表示范围作用的NSRange结构体的创建方式,处理几何图形的数据类型NSPoint和NSSize,以及由点和大小复合而成的矩形数据类型NSRect。同时还介绍了创建这些数据类型的方法,以及字符串类NSString的使用方法。 ... [详细]
  • 本文整理了Java中proj.zoie.impl.indexing.ZoieConfig.setMaxBatchSize()方法的一些代码示例,展示了Zoi ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
author-avatar
永不言败LM
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有