将文本插入到现有的大文件中

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 读入你的问题,找到插入的位置,然后写入新行和受影响的行。

以上是关于将文本插入到现有的大文件中的主要内容,如果未能解决你的问题,请参考以下文章

格瑞斯 GORM。将映射添加到现有的休眠映射

如何将绘图附加到现有的 pdf 文件

如何将熊猫数据添加到现有的 csv 文件中?

如何使用附加模式将音频录制到现有的音频文件中?

iText - 将内容添加到现有的 PDF 文件

如何将文件添加到现有的 docker 镜像? [复制]