【问题标题】:C# fast way to replace text in a html fileC#快速替换html文件中文本的方法
【发布时间】:2011-05-06 05:49:30
【问题描述】:

我想用另一个 HTML 文件中的文本替换我的 HTML 文件中某个范围内的文本(例如从位置 1000 到 200000)。有人可以推荐我最好的方法吗?

【问题讨论】:

  • 您能否对 HTML 文件中的 position 概念更具体一点?或许可以提供一个示例说明文件前后的外观。
  • 井字符位置,如IndexOf。从此行替换为此行或此字符串替换为此字符串。希望现在清楚了。
  • 听起来有风险.. 如果有人稍微更改 HTML 怎么办?您的代码可能会因意外问题而崩溃。这里的大局是什么?

标签: c# html file text replace


【解决方案1】:

Pieter 的方法可行,但它确实需要将整个文件加载到内存中。这可能没问题,但如果您有特别大的文件,您可能需要考虑替代方案:

  • 在原始文件上打开TextReader
  • 为目标文件打开TextWriter
  • 通过重复调用 Read/Write 来复制文本块,缓冲区为 8K 字符,直到您读取初始数量(在您的示例中为 1000 个字符)
  • 通过再次打开阅读器并复制块将替换文本写入目标写入器
  • 跳过原始文件中要忽略的文本,方法是重复读入缓冲区并忽略它(当然,增加一个计数器以便知道您跳过了多少)
  • 以同样的方式从原始文件中复制其余的文本。

基本上它只是大量的复制操作,包括一个不会去任何地方的“副本”(用于跳过原始文件中的文本)。

【讨论】:

    【解决方案2】:

    Pieter 发布的替换代码完成了这项工作,并且使用具有已知结果长度的 StringBuilder 是一种节省性能的聪明方法。

    应该按照您的要求做,但有时在处理像 html 这样的结构化数据时,最好将其加载为 XML(为此我使用了 HtmlAgilityPack)。然后您可以使用 XPath 找到您想要替换的节点,并使用它。它可能会更慢,但正如我所说,您可以使用该结构。

    【讨论】:

    • 改用StringBuilder。有了这个,您可以使用构造函数预先保留内存。在您的示例中,您首先从第一个Substring + myReplacement, and then a second string from this string and the second Substring. StringBuilder` 构造一个字符串效率更高。
    • 我其实是想试试这个方法,但我知道会有更好的方法,所以我在这里问。 Pieter,我会尝试你的代码,如果它有效,我将你的答案标记为正确。不过我完全忘记了 StringBuilder。
    【解决方案3】:

    试试这个:

    string input = File.ReadAllText("<< input HTML file >>");
    string replacement = File.ReadAllText("<< replacement HTML file >>");
    
    int startIndex = 1000;
    int endIndex = 200000;
    
    var sb = new StringBuilder(
        input.Length - (endIndex - startIndex) + replacement.Length
    );
    
    sb.Append(input.Substring(0, startIndex));
    sb.Append(replacement);
    sb.Append(input.Substring(endIndex));
    
    string output = sb.ToString();
    

    【讨论】:

    • 这对我不起作用,我的文件没有被替换。然后我用 File.WriteAllText("html file","re​​place string")
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多