处理大型文本文件,C#。修改文件。

3
请帮我解决这个问题。 我有一个巨大的input.txt文件。现在它是465Mb,但以后至少会达到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);

2
可能是如何读取、替换和写入非常大的文件?的重复问题。 - Nasreddine
3
它适用于短文本,但对于更长的文本则不行。这是什么意思?它会崩溃吗?请不要让我们去猜测!!!“不起作用”并不是一个有用的问题描述。 - TaW
较大文件的问题究竟是什么?是“text”变量的大小吗? - Mong Zhu
1
如果这是一个真正的应用程序,现在就是熟悉数据库的正确时机;-) - Tim Schmelter
使用函数File.ReadAllText()时发生了OutOfMemoryException。 - ShHolmes
在某个时刻,将整个文件读入内存变得不可能,因此需要分批(逐行)进行流式处理。 - user6144226
3个回答

5

3

尽量不要将整个文件加载到内存中,避免使用巨大的GB级数组、字符串等(可能你没有足够的RAM)。你能逐行处理文件吗(即你没有多行术语,对吧)?如果是这种情况,那么

  ...
  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);

1

逐行读取文件(或缓冲更多的行)。速度会慢一些,但应该可以工作。

另外,如果所有行都匹配您的条件,可能会出现问题。考虑在找到结果时将其写入临时文件,然后将文件重命名/移动到目标文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接