C #: поиск и замена строки текста - PullRequest
0 голосов
/ 14 июня 2011

Я ищу способ найти ключевое слово в текстовом файле через запятую, а затем заменить другое ключевое слово в этой строке.Например, если у меня есть следующая строка в большом текстовом файле:

Help, 0

Я хочу найти эту строку в текстовом файле (приказав программе найти первое слово «помощь») и заменить 0с 1, чтобы указать, что я прочитал его один раз, так что это выглядит так:

Help, 1

Спасибо

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Обычно очень плохая идея пытаться перезаписать данные в одном и том же файле: если ваш код выдает исключение, у вас останется частично обработанный файл;если ваша цель поиска и значение замены имеют разную длину, вам придется переписать оставшуюся часть файла.Обратите внимание, что они не применяются в вашей конкретной ситуации - но лучше не допустить, чтобы это стало привычкой.

Моя рекомендация:

  1. Открыть как входной файл, так и временный файл (Path.GetTempFileName)
  2. обработать и записать каждую строку (StreamReader.ReadLine)
  3. После завершения без ошибок переименуйте исходный файл во что-то вроде origFile.old
  4. переименуйте временный файл в исходное имя файла.

Если что-то пойдет не такудалить временный файл и выйти.Таким образом, исходный файл остается нетронутым в случае ошибки.

0 голосов
/ 14 июня 2011

Если вы хотите сделать замену «на месте» (то есть вы не хотите использовать другой, временный файл), вы должны сделать это с FileStream .

У вас есть пара опций, вы можете Read в потоке файлов, пока не найдете нужный текст, а затем выдать Write. Имейте в виду, что FileStream работает на уровне байтов, поэтому вам необходимо принять во внимание кодировку символов. Encoding.GetString выполнит преобразование.

Кроме того, вы можете искать текст и отмечать его положение. Затем вы можете открыть FileStream и просто Seek до этой позиции. Тогда вы можете выдать Write.

Это может быть самый эффективный способ, но он определенно более сложный, чем наивный вариант. С наивной реализацией вы:

Второго файла нет, но вы ограничены объемом памяти системы. Если вы знаете, что всегда имеете дело с небольшими файлами, то это может быть вариант. В противном случае вам необходимо ознакомиться с кодировкой символов и файловыми потоками.

Вот еще один SO вопрос по теме (включая пример кода): Редактирование текстового файла на месте через C #

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