Получить конкретные данные с помощью Regex из многих файлов - PullRequest
0 голосов
/ 18 октября 2019

Я столкнулся с некоторыми проблемами, чтобы получить конкретные данные из необработанных данных (странный файл журнала когда-либо). В основном мне нужно получить результаты измерения SerialNumber +, например:

Выходной файл: results.txt Содержимое файла: 123456789124,1.521978E-04 (те же результаты для более чем 100 файлов).

{@BTEST|123456789124|06|191016115628|000045|0|all||n|n|191016115713||002|32145698712
{@BLOCK|2%c407|01
{@A-CAP|1|+1.521978E-04{@LIM3|+1.267300E-04|+1.520760E-04|+1.013840E-04}}
{@RPT|DEVICES IN PARALLEL}
{@RPT|c436 47.0u}
{@RPT|c408 10.0u}
{@RPT|c409 10.0u}
{@RPT|c412 10.0u}
{@RPT|c420 10.0u}
{@RPT|c500 10.0u}
{@RPT|c502 10.0u}
{@RPT|c503 10.0u}
{@RPT|c580 10.0u}
{@RPT|c427 4.70u}
{@RPT|c702d 4.70u}
{@RPT|c712d 4.70u}
{@RPT|c750 4.70u}
{@RPT|c515 1.00u}
{@RPT|c516 1.00u}
{@RPT|c560 1.00u}
{@RPT|c1091 1.00u}
{@RPT|c701b 330n}
{@RPT|c114 100n}
{@RPT|c405 100n}
{@RPT|c501 100n}
{@RPT|c504 100n}
{@RPT|c581 100n}
{@RPT|c700a 100n}
{@RPT|c700c 100n}
{@RPT|c701d 100n}
{@RPT|c703d 100n}
{@RPT|c704d 100n}
{@RPT|c711d 100n}
{@RPT|c751 100n}
{@RPT|c752 100n}
{@RPT|c1090 100n}
{@RPT|c1502 100n}
{@RPT|c1503 100n}
{@RPT|q380 q380%r1 57.0k}
{@RPT|q400 q400%q1 500, 100}

В данный момент я могу получить серийный номер, но у меня возникают проблемы с получением результатов измерений. Вот мой код:

static void Main(string[] args)
    {
        Regex regex = new Regex(@"(?<={@BTEST\|)(.*?)(?=\|)");

        string LogPath = @"C:\Data\FailedLogs";

        var LogDBSNResult = @"C:\results1.txt";


        List<string> fileNames = new List<string>(Directory.GetFiles(LogPath));
        List<string> dbSerialNumbers = new List<string>();

        using (System.IO.StreamWriter file = new System.IO.StreamWriter(LogDBSNResult))
        {
            foreach (var filename in fileNames)
            {
                string fileContent = File.ReadAllText(filename);

                if (regex.IsMatch(fileContent))
                {
                    var result = regex.Match(fileContent).ToString();

                    // Adding the results in the list
                    dbSerialNumbers.Add(result);
                    Console.WriteLine("Found: " + result);
                    file.WriteLine(result);
                }
            }

            //List<string> removeDuplicated = dbSerialNumbers.Distinct().ToList();
            //foreach (var value in removeDuplicated)
            //{
            //    file.WriteLine(value);
            //}

        }     
    }

1 Ответ

0 голосов
/ 19 октября 2019

Я предлагаю разделить результаты поиска, схему для извлечения серийного номера и другую для извлечения результата измерения. Попробуйте:

string patSerial = @"(?<={@BTEST\|)(.*?)(?=\|)";
string patMeasur = @"(?<={@A-CAP\|\d\|.)(.*?)(?=\{)";
string LogPath = @"C:\Data\FailedLogs";
string LogDBSNResult = @"C:\results1.txt";

using (StreamWriter log = new StreamWriter(LogDBSNResult))
{
    foreach(string fileName in Directory.GetFiles(LogPath))
    {
        string fileContent = File.ReadAllText(fileName);

        if (Regex.IsMatch(fileContent, patSerial) && Regex.IsMatch(fileContent, patMeasur))
        {
            string serial = Regex.Match(fileContent, patSerial).Value;
            string measurement = Regex.Match(fileContent, patMeasur).Value;

            log.WriteLine($"{serial}, {measurement}");
        }
    }
}

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...