【问题标题】:Append a text file starting from a certain location in the source text file从源文本文件中的某个位置开始附加一个文本文件
【发布时间】:2014-04-16 19:52:03
【问题描述】:

我想在另一个文本文件(比如“original.txt”)中附加一个文本文件(比如“append.txt”),但不是“original.txt”的最后一行/字符。它应该从“original.txt”中找到的字符串的某个位置(比如说“match”)开始附加。并忽略“match”字符串位置后“original.txt”中的所有其他文本,并开始从“original.txt”文件中“match”字符串的位置附加“append.txt”文件。

我面临的问题是:

  1. 我无法将整个文件加载到内存中,因为这些文件可以达到 100 MB。因此,我决定使用 StreamReader 和 StreamWriter 并使用 ReadLine 和 WriteLine 进行逐行追加,并在一行中获取目标字符串的位置以找出从何处开始追加过程。这是最好的方法吗?

  2. 我不希望使用第三个临时文件(比如说“temporary.txt”)来获得最终文本,然后将“original.txt”替换为“temporary.txt”,因为传输的文件很大.是否可以不使用第三个临时文件?

我当前的代码是:

StreamReader TextFile = new StreamReader("original.txt");
StreamReader TextFileAppend = new StreamReader("append.txt");
StreamWriter TextFileTemp = new StreamWriter("temporary.txt");

sLine = TextFile.ReadLine();

while (!string.IsNullOrEmpty(sLine) && !TextFile.EndOfStream && !sLine.Contains("match"))
{
    TextFileTemp.WriteLine(sLine);
    sLine = TextFile.ReadLine();
    TextFileTemp.WriteLine(sLine);
}

TextFile.Close();

sLine = TextFileAppend.ReadLine();

while (!string.IsNullOrEmpty(sLine) && !TextFileAppend.EndOfStream)
{
    sLine = TextFileAppend.ReadLine();
    TextFileTemp.WriteLine(sLine);
}

TextFileTemp.Close();
TextFileAppend.Close();

File.Copy("temporary.txt", "original.txt", true);

上面的代码工作正常,但需要一个临时的第三个文件来保存合并的内容,然后用合并的文本文件替换“original.txt”。

代码没有错,但我想知道是否可以从某个位置而不是从末尾附加文件?

【问题讨论】:

  • 临时文件有什么问题?似乎是个好主意,以防有人在您开始应对和完成之前失败......
  • @PeterRitchie 不,没有错,但我想知道文件是否可以从某个位置而不是结尾附加?

标签: c# .net string streamreader streamwriter


【解决方案1】:

首先,100 Mb 并没有超出将整个文件内容读入字符串然后使用内存中的函数更快的范围。重要的是,像这样操作大字符串可能会很慢。

试试这个:

string originalContents = File.ReadAllText("original.txt");
string insertContents = File.ReadAllText("append.txt");
int index = originalContents .IndexOf("match");
if (index == -1) return;
FileStream stream = new FileStream("original.txt", FileMode.Open);
stream.Position = index;
byte[] insertBytes = Encoding.ASCII.GetBytes(insertContents);
stream.Write(insertBytes);
byte[] endBytes = Encoding.ASCII.GetBytes(originalContents.Substring(index));
stream.Write(endBytes);

【讨论】:

  • 代码:File.ReadAllText("original.txt") 是否不会将进程所需的内存增加到 100 MB?
  • 会的。你的内存限制真的那么严格吗?无论如何,您要在文件中间插入什么?没有真正的方法可以插入文件。您将不得不用插入的数据覆盖一部分,并将所有旧数据复制到其位置加上插入的长度。您可以在我的答案的基础上让它在文件中循环。
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2019-01-30
  • 2014-04-20
相关资源
最近更新 更多