Поиск переменных по текстовому файлу и приравнивание их в программе существующим переменным

Существует файл "123.txt", в котором написано следующее:

namespace Variable
{
class VariableEdit
 {
  public const int abc = 123
 }
}

В программе существует такая же переменная abc. Нужно прочитать файл (123.txt), найти переменную эту в файле (abc) и записать её значение в программу (переменная в программе: abc). Я пока что нашёл только такой код, чтобы найти строку, в которой есть данная переменная abc

StreamReader str = new StreamReader(Application.StartupPath + $"/123.txt", Encoding.Default);
while (!str.EndOfStream)
{
 string st = str.ReadLine();
 if (st.StartsWith("abcToProgramm")) //переменная, которая в программе написана
 {
  Variable.abc = st; //класс Variable, в котором существует данная переменная
  break;
 }
}

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

namespace Variable
{
 public static class Variable
 {
  public const int abc;
 }
}

Ответы (3 шт):

Автор решения: Vasya Milovidov
...

if (st.Trim().StartsWith("public const int abc")) //переменная, которая в программе написана
{
  var index = st.Trim().LastIndexOf("public const int abc = ");
  Variable.abc = int.Parse(st.Substring(index).Trim());
  break;
}
...

Так же рекомендую почитать про то как работать с строками в c#. Пример выше решает вашу задачу в лоб и не оптимален, применив это решение вы возможно сможете сформулировать свой вопрос в более общем виде.

→ Ссылка
Автор решения: aepot

Вот так можно попробовать

string text = File.ReadAllText(Application.StartupPath + $"/123.txt");
string search = "abc =";
text = text.Substring(text.IndexOf(search) + search.Length);
text = text.Remove(text.IndexOf("\r\n")); // \r\n - перенос строки
if (text.Contains(";")) text = text.Remove(text.IndexOf(";"));
if (int.TryParse(text.Trim(), out int num))
{
    Console.WriteLine("Найдено abc: " + num);
    Variable.abc = num;
}
else
{
    Console.WriteLine("abc не найдено");
}
→ Ссылка
Автор решения: EvgeniyZ

Вообще для таких целей есть специальные методы по разбору CS кода, одним из примеров могу посоветовать данный ответ.

Но если вам все же нужно разбивать этот файл как строку, то можно использовать "всемогущий" LINQ, ибо достаточно найти ключевые аспекты, по которым надо сделать поиск. У вас это строка, знак = и также знак ; (который должен быть в конце строки, но у вас почему-то его нет).

Имея это делаем примерно следующее:

var findValue = File.ReadAllLines("Test.txt")
    .FirstOrDefault(x => x.Contains("abc"))?
    .Split(new[] { '=', ';' }, StringSplitOptions.RemoveEmptyEntries)
    .LastOrDefault();

if (int.TryParse(findValue, out int result))
{
    Console.WriteLine(result);
}
  • File.ReadAllLines("Test.txt") - читаем файл как массив строк.
  • .FirstOrDefault(x => x.Contains("abc")) - из полученного файла берем ту строку, которая содержит abc. Тут есть пару но - если у вас надо найти определенный тип, то стоит дописать условие, если таких переменных много и они расположены в разных методах например, то тоже придется дописать! Данный вариант просто берет строку в надежде, что она у нас одна.
  • ? - Если предыдущий вызов не дал NULL, то мы выполняем код дальше, иначе пропускаем и выдаем NULL в результат.
  • .Split(new[] { '=', ';' }, StringSplitOptions.RemoveEmptyEntries) - разбиваем полученную строку по = и ; - это даст нам строковой массив, где первым значением будет все до =, вторым все после (но до ;), а 3-м все после ;. Так, как после ; обычно у нас пустота (я надеюсь, что она у вас там), то мы убираем эту пустоту при помощи StringSplitOptions.RemoveEmptyEntries.
  • .LastOrDefault(); - берем из полученного массива последнее значение. Если у вас после ; есть что-то еще, то тут строит наверно брать 2-е значение (то, что строго после =).

В findValue у нас будет string значение с необходимым числом, либо NULL, если такого нет. Остается нам это число преобразовать в правильный формат, int и делает это

int.TryParse(findValue, out int result)

Он вернет нам bool значение, где true - удалось преобразовать, а false - нет. Само значение он отдаст через out.

→ Ссылка