Поиск и замена в txt

183
02 апреля 2018, 20:53

Всем привет! Столкнулся со следующей задачей. Есть документ формата txt

7200
20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.570136 2.51 2.63
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.572938 2.51 2.63
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.615161 2.57 2.65
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1

В первой строке число 7200 - т.е. это количество блоков. Далее есть строки

20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
и т.д. 7200 раз

Вот в этих строках мне нужно заменить цифру 20 на цифру 160 Прошу помощи.

Answer 1

Ну вот вам регулярное выражение, которое ищет "20", которое стоит в начале строки, а после него следует ровно 8 групп из символов цифр, знаков +-, точки или буквы E разделенных пробелом и с переводом строки: (?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)

Проверить можно так:

var input = @"7200
20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.570136 2.51 2.63
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.572938 2.51 2.63
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.615161 2.57 2.65
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1";
var pattern = @"(?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)";
var replacement = "160";
var result = Regex.Replace(input, pattern, replacement, RegexOptions.Multiline);
Console.WriteLine(result);

Для загрузки входной строки из файла используйте File.ReadAllText, а для записи File.WriteAllText, итого ваш код будет выглядеть так:

var filename = "...";
var input = File.ReadAllText(filename);
var pattern = @"(?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)";
var replacement = "160";
var result = Regex.Replace(input, pattern, replacement, RegexOptions.Multiline);
File.WriteAllText(filename, result);

Универсальный шаблон, если число, которое необходимо заменить, может быть любым (целым неотрицательным):

var pattern = @"(?<=^)\d+(?=( [\d\-\+E\.]+){8}\r?$)";
READ ALSO
Объединение метода в дженерик

Объединение метода в дженерик

У меня есть несколько похожих методов вида:

202
Передача string msg из Thread1 в Thread2 Form TextBox.Text

Передача string msg из Thread1 в Thread2 Form TextBox.Text

Имеется некий поток ThreadTwo где расположен код:

144
js telegram bot

js telegram bot

Помогите разобраться с ошибкой в кодеВ данном коде бот не запускается из-за строки: if (error) throw new Error(error) - она находится в конце кода в функции...

243
Найти все совершенные числа, меньшие n : JavaScript

Найти все совершенные числа, меньшие n : JavaScript

ПомогитеВот сам код, который, к сожалению, не работает:Посмотрите, пожалуйста, в чем ошибка

238