热门标签 | 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#学习教程,希望大家多多关注---编程笔记


推荐阅读
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 本文介绍了如何使用C# Winform开发局域网内的文件传输功能,详细描述了从用户界面到后端网络通信的具体实现。 ... [详细]
  • 近期在研究Java IO流技术时,遇到了一个关于如何正确读取Doc文档而不出现乱码的问题。本文将详细介绍使用Apache POI库处理Doc和Docx文件的具体方法,包括必要的库引入和示例代码。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • 本文介绍了一个实用的工具类 `ListExtensions`,提供了多种针对 `List` 的扩展方法,包括无序和有序列表中的对象检索及计数功能。 ... [详细]
  • 本文通过具体示例详细介绍了 Python 中的装饰器和装饰类的使用方法,包括带参数的装饰器和装饰类的应用场景。 ... [详细]
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
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社区 版权所有