繁体   English   中英

换行的C#Reqex,后跟char和10位数字

[英]C# Reqex for new line followd by char and 10 digits

我的问题是:我有一个大约100 Mb的文件,我试图逐行读取并进行一些处理。 表现不是很好。 这就是为什么我现在要立即使用ReadAllLines()更改并在内存中读取它,然后将其拆分到一些报告中,这些报告以包含T的行和后跟10位数字的行来标记。 有人可以帮助我生成可用于拆分的正确正则表达式吗?

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

这个对吗? 提前致谢!

您的案例的分割模式如下所示:

(?=\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());
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM