c#通过更改行号来拆分文本文件

时间:2012-06-06 05:50:17

标签: regex string c#-4.0 text

我正在尝试按行号拆分文本文件, 例如,如果我有像:

这样的文本文件
1 ljhgk uygk uygghl \r\n
1 ljhg kjhg kjhg kjh gkj  \r\n
1 kjhl kjhl kjhlkjhkjhlkjhlkjhl  \r\n
2 ljkih lkjhl kjhlkjhlkjhlkjhl  \r\n
2 lkjh lkjh lkjhljkhl  \r\n
3 asdfghjkl  \r\n
3 qweryuiop  \r\n

我想把它分成3个部分(1,2,3), 我怎样才能做到这一点?文本的大小非常大(~20,000,000个字符),我需要一种有效的方式(如正则表达式)。

2 个答案:

答案 0 :(得分:1)

另一个想法是,您可以使用linq通过按每个第一个单词拆分来获取您所追求的组。请注意,这将采用每个第一个单词,因此请确保您只有数字。这是使用split / join反模式,但它似乎在这里很好用。

var lines = from line in s.Split("\r\n".ToCharArray(), 
                                 StringSplitOptions.RemoveEmptyEntries)
            let lineNumber = line.Split(" ".ToCharArray(), 2).FirstOrDefault()
            group line by lineNumber
            into g
            select String.Join("\n", g);

注意:

  • GroupBy被允许按照它们出现的顺序返回行。
  • 如果某个区块出现多次(例如"1 1 2 2 3 3 1"),则会合并所有具有相同编号的区块。

答案 1 :(得分:0)

您可以使用正则表达式,但Split不会运行得太好。您可以匹配以下模式:

^(\d).*$          # Match first line, capture number
([\r\n]+^\1.*$)*  # Match additional lines that begin with the same number

示例:here

我确实尝试按$(?<=^(\d+).*)[\r\n]+^(?!\1)拆分,但它将行号添加为数组中的附加元素。