使用ReadAllText()方法时'System.OutOfMemoryException'

时间:2015-08-06 02:32:30

标签: c# replace out-of-memory flat-file

我有一个制表符分隔文件,其中包含8,000,000多行,其中包含一些流氓标签。

例如:

a->b->c->d
a->b->c->-->-->--d
a->b->c->d
a->b->c->d

我有一种方法可以纠正流氓标签(3个标签到1个标签),如下所示:

string text = File.ReadAllText(filePath);
text = text.Replace("\t\t\t", "\t");
File.WriteAllText(filePath, text);

上面的代码块会产生以下错误:

  

发生了类型为“System.OutOfMemoryException”的未处理异常   在mscorlib.dll中

我如何一次只读取和写入一行,以便整个文件不在内存中?

1 个答案:

答案 0 :(得分:1)

http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html为您提供了一个懒惰的IEnumerable<string>。你可以迭代它,一次只加载一行。

但是,您需要写一个不同于您读取的文件。完成后可以删除/重命名。

这是一个处理文件的单行程序:

File.WriteAllLines(outputFile, 
    File.ReadLines(inputFile).
    Select(t => t.Replace("\t\t\t", "\t"))
);