2015-12-26 2 views
-2

Я пытаюсь сделать небольшой код на C#, который откроет файл .cfg и начнет поиск слова, а затем заменит его текстом, но это еще не все, потому что i уже нашел, как это сделать, но проблема в том, что я хочу сделать некоторые проверки, например, если файл содержит «Hello» ИЛИ «Привет» ИЛИ «blabla» где-то, замените его «Bye» (это просто пример)Откройте файл и найдите некоторые значения и отредактируйте их

Я хочу сделать это с помощью простого кода

ПРИМЕЧАНИЕ: уже использовал этот, но, похоже, это только один чек ...

string var = File.ReadAllText("mycfg.cfg"); 
var = var.Replace("Hi", "Bye"); 
File.WriteAllText("mycfg.cfg", var); 

и еще одна вещь: я хочу сделать то же самое, но еще 2 раза.

+5

Вы не можете назвать переменную 'var', поскольку это ключевое слово в C#, в противном случае ваш код в порядке и должен работать. –

+2

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

+0

Если вы ищут замену трех разных шаблонов символов той же заменой, которую вы, возможно, захотите рассмотреть, используя регулярные выражения. Это может быть излишним для того, что вы делаете, но всякий раз, когда я нахожу, что я заменяю несколько вещей одним и тем же текстом, я начинаю рассматривать регулярное выражение для решения. Если вы собираетесь делать несколько замен разных вещей, вы должны, вероятно, прочитать весь текст в 'StringBuilder' (в зависимости от размера вашего файла), чтобы сохранить перераспределение строк, с которыми вы столкнетесь с заменой достижений. – pstrjds

ответ

0

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

string fileContent = File.ReadAllText("mycfg.cfg"); 
fileContent = fileContent.Replace("Hi", "Bye").Replace("Hello", "Bye").Replace("blabla", "Bye"); 
File.WriteAllText("mycfg.cfg", fileContent); 

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

string fileContent = File.ReadAllText("mycfg.cfg"); 
fileContent = fileContent.Replace("Hi", "Bye"); 
fileContent = fileContent.Replace("Hello", "Bye"); 
fileContent = fileContent.Replace("blabla", "Bye"); 
File.WriteAllText("mycfg.cfg", fileContent); 

StringBuilder can be used таким же образом, но это будет более эффективным только для некоторых случаев со строками длинномерных во входных данных. Если вы не уверены или не имеете проблем с производительностью, лучше использовать String.

+0

Одно примечание между этим подходом и регулярным выражением состоит в том, что вы не можете называть 'Replace' в случае, нечувствительном. Если вам нужно, чтобы это было нечувствительным к регистру, вы должны были бы принять другой подход. – pstrjds

+0

спасибо, его работа так и должна быть. – Shryder

0

Я хочу проверить несколько слов, и если любой из них существует, замените его с «Bye»

Вы можете сначала разделить входной строки на слова, а затем использовать LINQ-х Select и, наконец, String.Join:

List<string> wordsToReplace = new List<string> {"Hi", "Hello", "Blabla"}; 
string file = File.ReadAllText("mycfg.cfg"); 

string result = String.Join(" ", file.Split().Select(word => wordsToReplace.Contains(word) ? "Bye" : word)); 

File.WriteAllText("mycfg.cfg", result); 

Edit:

var lines = File.ReadLines("mycfg.cfg"); 

var modified = lines.Select(line => Regex.Replace(line, @"\bplayer\s\d\b", "Bye")); 

File.WriteAllLines("mycfg.cfg", modified); 
+0

похоже, что я не работал, вот мой код 'Список wordsToReplace = новый Список {" player \ "1 \" "," player \ "2 \" "," player \ "3 \" " }; string file = File.ReadAllText ("players/config.cfg"); string result = String.Join ("", file.Split(). Выберите (word => wordsToReplace.Contains (word)? "Player \" 0 \ "": word)); Файл.WriteAllText ("players/config.cfg", result); ' и btw, код ур сделал мой файл без перерывов, поэтому все написано в одной строке, так как оно должно быть как 100 строк или 80-70 ... – Shryder

+0

Это не работает, потому что «игрок 1» состоит из 2 слов, а не 1. –

+0

, так как я могу заставить его работать? потому что это то, что мне нужно ^^ – Shryder

0

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

var reg = new Regex(@"\b(hi|hello|blabla)", RegexOptions.IgnoreCase); 
var fileText = File.ReadAllText("mycfg.cfg"); 
fileText = reg.Replace("bye"); 
File.WriteAllText("mycfg.cfg", fileText); 

Если вы хотите слишком, чем вы должны настроить шаблон, чтобы соответствовать тому, что вы должны соответствовать, чтобы заменить другие строки. Поэтому, если вам нужно соответствовать Hi, Hello, blabla и игроку «0» или игроку «1», настройте свое выражение.

var reg = new Regex(@"\b(player ""\d""|Hi|Hello|blabla)", RegexOptions.IgnoreCase); 
var fileText = File.ReadAllText("mycfg.cfg"); 
fileText = reg.Replace("bye"); 
File.WriteAllText("mycfg.cfg", fileText); 
+0

Я не думаю, что регулярное выражение является хорошим способом по соображениям производительности. –

+0

@VadimMartynov - По сравнению с перераспределением всего содержимого файла четыре раза? Кажется, это может быть похоже. Я не проверял его, поэтому не могу сказать точно. Если регулярное выражение слишком тяжелое, вы можете пойти с StringBuilder, чтобы избежать перераспределения. – pstrjds

+0

Да, [StringBuilder будет лучшим способом] (http://stackoverflow.com/questions/1321331/replace-multiple-string-elements-in-c-sharp) для случайных больших текстов. –

Смежные вопросы