C # быстрый способ заменить текст в HTML-файл - PullRequest
0 голосов
/ 07 ноября 2010

Я хочу заменить текст из определенного диапазона в моем HTML-файле (например, с позиции 1000 до 200000) текстом из другого HTML-файла. Может ли кто-нибудь порекомендовать мне лучший способ сделать это?

Ответы [ 3 ]

5 голосов
/ 07 ноября 2010

Способ Питера будет работать, но он включает в себя загрузку всего файла в память. Это может быть хорошо, но если у вас есть особенно большие файлы, вы можете рассмотреть альтернативу:

  • Открыть TextReader исходный файл
  • Открыть TextWriter для целевого файла
  • Копирование блоков текста путем многократного вызова Read / Write, с буфером, скажем, 8K символов, пока вы не прочитаете начальную сумму (1000 символов в вашем примере)
  • Запишите замещающий текст целевому устройству записи, снова открыв считыватель и скопировав блоки
  • Пропустить текст, который вы хотите игнорировать в исходном файле, многократно читая в буфер и просто игнорируя его (увеличивая счетчик, чтобы вы знали, сколько вы пропустили, конечно)
  • Аналогичным образом скопируйте оставшуюся часть текста из исходного файла.

По сути, это просто множество операций копирования, включая одну «копию», которая никуда не денется (для пропуска текста в исходном файле).

1 голос
/ 07 ноября 2010

Попробуйте это:

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();
0 голосов
/ 07 ноября 2010

Код замены, который опубликовал Питер, выполняет свою работу, и использование StringBuilder с известной полученной длиной является разумным способом сохранить производительность.

Должен делать то, что вы просили, но иногда при работе со структурированными данными, такими как html, предпочтительно загружать его как XML (для этого я использовал HtmlAgilityPack ). Затем вы можете использовать XPath, чтобы найти узел, который вы хотите заменить, и работать с ним. Это может быть медленнее, но, как я уже сказал, тогда вы можете работать со структурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...