将文本插入到现有的大文件中
Posted
技术标签:
【中文标题】将文本插入到现有的大文件中【英文标题】:Insert text into large existing file 【发布时间】:2015-04-13 08:47:51 【问题描述】:我有一个包含大约 2000 行文本的文件,我需要在其中添加几行。我最初的解决方案是将现有文件复制到一个新文件中,然后在其末尾添加几行。直到我意识到文件中的最后一行必须始终是最后一行。所以现在我需要在那一行文本之前添加我的新行。我知道我可以读取整个文件,将其保存到我的程序中,然后将所有内容写入一个包含额外行的新文件。但由于该文件有这么多行,我想知道这是否是一种更好的方法。
【问题讨论】:
从性能的角度来看,如果您可以将新行附加到文件末尾而不是预先添加它们会更好。当然,如果需要,您需要在应用程序中进行反转。 @Robert 我知道,这就是为什么这是我最初的解决方案。但当前是最后一行的行必须始终是最后一行。 【参考方案1】:您需要将其复制到一个新文件中。不幸的是,没有办法将数据注入到文件的中间。
但是,您不必将其加载到内存中即可。您可以使用 StreamReader
并一次只读取一行,或者更好的是 System.IO.File.ReadLines
方法。
int newLineIndex = 100;
string newLineText = "Here's the new line";
using (var writer = new StreamWriter(outputFileName))
int lineNumber = 0;
foreach (var line in File.ReadLines(inputFileName))
if (lineNumber == newLineIndex)
writer.WriteLine(newLineText);
else if (lineNumber > 0)
writer.WriteLine();
writer.Write(line);
lineNumber++;
当然,如果您愿意假设新行将始终位于索引零处,这将变得更加容易。如果是这种情况,我很想放弃其中的大部分内容,在写完第一行之后使用简单的Stream.CopyTo
。但这应该仍然有效。
string newLineText = "Here's the new line";
using (var writer = new StreamWriter(outputFileName))
using (var reader = File.OpenRead(inputFileName))
writer.WriteLine(newLineText);
reader.CopyTo(writer.BaseStream);
当然,有多种方法可以执行此操作,但需要权衡取舍。这只是一种选择。
【讨论】:
新行放在哪里实际上并不重要,只要它们不是文件中的最后一行。考虑到这一点,您建议我创建一个新文件,将新行写入该文件的开头,然后复制旧文件? @JesperEvertsson 是的,这可能就是我会做的。我添加了一些示例,说明我可能会如何考虑将它们添加到开头。 我尝试执行您的第二个解决方案,但对我来说,在文件末尾添加了新行 @JesperEvertsson 很有趣。我不确定为什么第二个会发生这种情况。第一个会有这个问题,我现在意识到,我已经编辑来解决这个问题。但是第二个应该没问题。 我使用了您提供的第一个解决方案的修改版本,现在它可以按预期工作。【参考方案2】:我可以读取整个文件,将其保存到我的程序中,然后将所有内容写入一个包含我额外行的新文件。
并非所有内容都需要编写。只需将插入的行和插入行之后的行写入原始文件,从插入行的位置(字节索引)开始。
【讨论】:
这个问题是我事先不知道文件会有多大,而且每个文件都不一样 @JesperEvertsson 读入你的问题,找到插入的位置,然后写入新行和受影响的行。以上是关于将文本插入到现有的大文件中的主要内容,如果未能解决你的问题,请参考以下文章