Поиск переменных по текстовому файлу и приравнивание их в программе существующим переменным
Существует файл "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 шт):
...
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#. Пример выше решает вашу задачу в лоб и не оптимален, применив это решение вы возможно сможете сформулировать свой вопрос в более общем виде.
Вот так можно попробовать
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 не найдено");
}
Вообще для таких целей есть специальные методы по разбору 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.