Получение строки / текста после определенной фразы - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно получить слово после «Запуск модуля» из файла журнала.Слово после «Запуск модуля» всегда заканчивается полной остановкой (.) Мне нужно вставить это слово в массив для последующего доступа, когда он мне понадобится.

Пример текста из журнала:

25.5.2018 10: 42: 35.621 Сообщение о состоянии 0884: Запуск модуля SamplesSim.

25.5.2018 10: 42: 35.621 Сообщение о состоянии 0120: Ввод данных: Открытие: T: \ RCS \ BiggieStatementsOn \PRINT \ INPUTJACK \ FCA_HomeBandAccounts_23052018.csv.(DataInput1)

Я пытался использовать indexOf(), но в качестве выходных данных я получаю "Run".

Вот мой код:

string consoleOutput = compiler.StandardOutput.ReadToEnd();

startIndex = consoleOutput.IndexOf("Running module");
string[] ModuleParams;
string runningMod = "";

if (startIndex != -1)
{
    lastIndex = startIndex +3;
    if (lastIndex != -1)
    {
        ModuleParams = consoleOutput
                           .Substring(startIndex, lastIndex - startIndex)
                           .Split(' ');

        runningMod = ModuleParams[0];
                     //.Substring(4).Replace("Running module", "").Trim();
    }                                
    Console.WriteLine(runningMod);
}

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

Я исправил твой код, теперь он выводит SamplesSim

using System;

public class Program
{
    public static void Main()
    {
            string consoleOutput = @"
                25.5.2018 10:42:35.621 Status message 0884:Running module SamplesSim.

                25.5.2018 10:42:35.621 Status message 0120:Data Input: Opening: T:\RCS\BiggieStatementsOn\PRINT\INPUTJACK\FCA_HomeBandAccounts_23052018.csv. (DataInput1)
            ";
            string wordToFind = "Running module";
            var startIndex = consoleOutput.IndexOf(wordToFind);
            string[] ModuleParams;
            string runningMod = "";

            if (startIndex != -1)
            {
                var lastIndex = startIndex + wordToFind.Length;
                if (lastIndex != -1)
                {
                    ModuleParams = consoleOutput
                                       .Substring(startIndex+wordToFind.Length, consoleOutput.Length - (startIndex+wordToFind.Length))
                        .Split(new char[]{' ','\n','.'}, StringSplitOptions.RemoveEmptyEntries);

                    runningMod = ModuleParams[0];
                                 //.Substring(4).Replace("Running module", "").Trim();
                }                                
                Console.WriteLine(runningMod);
            }
    }
}
0 голосов
/ 25 мая 2018

Попробуйте следующее.

string mystring = "25.5.2018 10:42:35.621 Status message 0884:Running module SamplesSim.";
string keyWord = "Running module";
string extractedWord = mystring.Substring(mystring.IndexOf(keyWord) + keyWord.Length).Trim();
Console.WriteLine(extractedWord);

Приведенный выше код вернет SampleSim Он также удаляет все пробелы в строке.

0 голосов
/ 25 мая 2018

Вы можете использовать регулярное выражение как таковое.Смотри https://regex101.com/r/Xm25z5/1

/Running module\s[a-zA-Z]+.$/gm
0 голосов
/ 25 мая 2018

Могут быть более чистые способы сделать это, но это должно сработать.

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1].Split('.')[0];

Поэтому я разделил вывод консоли на строку «Running module» и взял текст с правой стороны от split,Затем я снова разделил на "."и взял значение на левой стороне.Это довольно грязно, поэтому я буду искать улучшения.

РЕДАКТИРОВАТЬ: Забыл упомянуть, вам, возможно, придется обрезать пробелы в начале строки, как если бы у вас было что-то вроде "Running module renamer"ваш вывод после разбиения будет "переименовывать".Вы можете просто использовать text = text.Trim();, чтобы удалить все пробелы, или text = text.TrimStart();, чтобы удалить пробелы с самого начала.Кроме того, вы можете добавить его в конец кода выше, но я слышал, что это плохая практика.

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1].Split('.')[0].Trim();

Возможно, было бы лучше распространить его немного

string text = consoleOutput.Split(new string[] { "Running module" }, StringSplitOptions.None)[1];
text = text.Split('.')[0];
text = text.Trim();
...