【问题标题】:Working on huge text file, C#. Modifying the file处理巨大的文本文件,C#。修改文件
【发布时间】:2021-06-15 02:26:20
【问题描述】:

请帮我解决这个问题。 我有一个巨大的 input.txt。现在是 465 Mb,但以后至少会是 1Gb。

用户输入一个词(不是整个词)。使用该术语,我需要找到一个包含它的单词,将其放在<strong> 标记之间并将内容保存到 output.txt。术语搜索应该不区分大小写。

这是我目前所拥有的。它适用于小文本,但不适用于较大的文本。

Regex regex = new Regex(" "); 

string text = File.ReadAllText("input.txt"); 
Console.WriteLine("Please, enter a term to search for"); 
string term = Console.ReadLine(); 

string[] w = regex.Split(text); 

for (int i = 0; i < w.Length; i++) 
{ 
    if (Processor.Contains(w[i], term, StringComparison.OrdinalIgnoreCase)) 
    { 
        w[i] = @"<strong>" + w[i] + @"</string>"; 
    } 
} 

string result = null; 
result = string.Join(" ", w); 

File.WriteAllText("output.txt", result);

【问题讨论】:

  • 它适用于小文本,但不适用于大文本。 什么意思?会崩溃吗??不要让我们猜测!!! “不起作用”是没有帮助的问题描述!
  • 大文件到底有什么问题? textvariable 的大小?
  • 如果这是一个真正的应用程序,那将是熟悉数据库的最佳时机;-)
  • OutOfMemoryException with function File.ReadAllText();

标签: c# text io


【解决方案1】:

尝试一次读取整个文件会导致内存异常。考虑分阶段读取文件。 FileStream 和 BufferedStream 类提供了这样做的方法:

https://msdn.microsoft.com/en-us/library/system.io.filestream(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.io.bufferedstream.read(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    尽量不要将整个文件加载到内存中,避免使用巨大的 GB 大小的数组、Strings 等(您可能只是没有足够的 RAM)。你能逐行处理文件吗(即你没有multiline条款,对吗?)?如果是你的情况,那么

      ...
      var source = File
        .ReadLines("input.txt") // Notice absence of "All", not ReadAllLines
        .Select(line => line.Split(' ')) // You don't need Regex here, just Split 
        .Select(items => items
          .Select(item => String.Equals(item, term, StringComparison.OrdinalIgnoreCase) 
             ? @"<strong>" + term + @"</strong>" 
             : item))
        .Select(items => String.Join(" ", items));
    
      File.WriteAllLines("output.txt", source);
    

    【讨论】:

      【解决方案3】:

      逐行读取文件(或缓冲更多行)。有点慢,但应该可以工作。

      如果所有行都符合您的术语,也可能会出现问题。找到结果后考虑将结果写入临时文件,然后将文件重命名/移动到目标文件夹。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        • 2014-04-10
        • 2011-05-16
        • 2010-11-13
        • 2017-09-14
        相关资源
        最近更新 更多