C # Reqex для новой строки, за которой следуют char и 10 цифр - PullRequest
0 голосов
/ 25 июня 2018

Моя проблема: У меня есть файл около 100 Мб, который я пытался прочитать построчно и выполнить некоторую обработку. Производительность была не очень хорошей. Вот почему я хочу сейчас изменить и прочитать его в памяти сразу, используя ReadAllLines (), а затем разделить его на несколько отчетов, которые отмечены строкой, содержащей T, за которой следуют 10 цифр. Может ли кто-нибудь помочь мне с генерацией правильного регулярного выражения, которое я могу использовать для разбиения, я думаю о чем-то вроде:

@"(\n|\r|\r\n)[T](?<!\d)\d{10}(?!\d)", 

это правильно? Заранее спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Шаблон разбиения для вашего случая может выглядеть так:

(?=\DT\d{10}\D)

Пример кода :

using System;
using System.Text.RegularExpressions;
class Test
{
  static void Main(string[] args)
    {
      String sourcestring = @"sdfso dadfjlsdfjksdjfkjsd
sdfso dadfjlsdfjksdjfkjsd
T1234567898dssdkfjskfjksdj
T1234567890dssdkfjskfjksdj
sdfso dadfjlsdfjksdjfkjsd
T1234567891dssdkfjskfjksdj";
      String matchpattern = @"(?=\DT\d{10}\D)";
      Regex re = new Regex(matchpattern); 
      String[] splitarray = re.Split(sourcestring);
        for(int sIdx = 0; sIdx < splitarray.Length; sIdx++ ) {
          Console.WriteLine("[{0}] = {1}", sIdx, splitarray[sIdx].Trim());
        }
    }
}

В зависимости от вашего контекста вам, вероятно, все еще лучше читать построчно большой файл и собирать отдельные отчеты / блоки в Списке или тому подобное, как это было предложено Wiktor. Вы также можете продолжить обработку отчетов / блоков параллельно. Я предлагаю использовать классы StreamReader и StringBuilder.

Пример реализации

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
class Program
{
    static void Main(string[] args)
    {
        string pattern = @"^T\d{10}\D";
        var re = new Regex(pattern);

        var result = new List<string>();
        var block = new StringBuilder();
        var fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Read);
        using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
        {
            string line;
            while ((line = streamReader.ReadLine()) != null)
            {
                if (re.IsMatch(line))
                {
                    //store current block or hand it off to different process, etc.
                    result.Add(block.ToString());
                    block.Clear();
                }
                block.AppendLine(line);
            }
            // final block
            result.Add(block.ToString());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...