C # считывает из файла целое число и игнорирует все остальное

#c#

#c#

Вопрос:

У меня есть config.txt файл, который выглядит примерно так

 some text here = 5
another text line here = 4 with random garbage
some other line = 2 5 some number 12
7
foo bar 9
  

Чтобы уточнить, ТОЛЬКО число сразу после » = «. Только одно число, которое отображается после «=»

Я хочу иметь возможность извлекать целые числа ТОЛЬКО после «= «. Итак, в этом случае вывод должен выглядеть следующим образом

 5
4
2
  

Я делал это раньше на C с чем-то вроде этого

 if (file_to_read.is_open()) {
        file_to_read.ignore(numeric_limits<streamsize>::max(), '='); 
        while (file_to_read >> input) { 
            values.push_back(input);
            file_to_read.ignore(numeric_limits<streamsize>::max(), '=');
        }
        file_to_read.close();
  

Я хочу понять, как вы делаете это на C #, и есть ли какая-либо документация, на которую я могу сослаться

Комментарии:

1. Разве выходные данные не должны быть 5 и 4?

2. Просто используйте = (d ) регулярное выражение…

3. @Альберт Алонсо, да, это должно быть 5 и 4. Извиняюсь за опечатку.

4. Это правильно @RufusL это было

5. Существует много информации о том, как читать текстовый файл с помощью c #, как выполнять цикл foreach , for или while (для обработки данных файла) и как сравнивать символы с разными значениями. Что вы уже пробовали? Если вы покажете нам, где вы застряли, было бы легче помочь.

Ответ №1:

Используя регулярные выражения, процедура не слишком сложна. Фильтрация при чтении потока кажется слишком сложной для этого. Просто сделайте это:

  • Считывает текстовый файл в одну строку
  • Используйте регулярное выражение, которое выполняет поиск шаблона, содержащего буквенную " = " строку, за которой следуют числовые символы d .
  • Заключение числовой части выражения в круглые скобки позволяет записать его в группу # 1, которую вы можете извлечь из Match объекта как m.Groups[1].Value .
  • Каждое найденное целое число анализируется и добавляется в список целых чисел
  • После операции возвращается список.

     public static List<Int32> ExtractInts(String filePath)
    {
        String input = File.ReadAllText(filePath);
        List<Int32> ints = new List<Int32>();
        Regex r = new Regex(" = (\d )");
        MatchCollection mc = r.Matches(input);
        foreach(Match m in mc)
            ints.Add(Int32.Parse(m.Groups[1].Value));
        return ints;
    }
      

Ответ №2:

Поехали:

 string input =
@"some text here = 5
another text line here = 4 with random garbage
some other line = 2 5 some number 12
7
foo bar 9";

var matches = Regex.Matches(input, @"(?:.*(?<==).*)(d )");
foreach(Match match in matches)
{
    Console.WriteLine(match.Groups[1]);
}
  

Вывод:

 5
4
2
  

Для регулярного выражения происходит вот что:
Неселективный поиск любого символа любое количество раз, за которым следует знак ‘=’:

 (?:.*(?<==).*)
  

И это для сопоставления цифр:

 (d )
  

Добро пожаловать. =)

Комментарии:

1. Если вы используете группу захвата, вам не нужен поиск сзади. Вы можете просто использовать литерал » = » перед d.