1

たとえば、次のようなテキストファイルがある場合、テキストファイルを行番号で分割しようとしています。

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文字)、効率的な方法(正規表現など)が必要です。

4

2 に答える 2

1

別のアイデアとして、linqを使用して、最初の単語ごとに分割することで、目的のグループを取得できます。これは最初の単語ごとに使用されることに注意してください。そのため、そこには数字だけがあることを確認してください。これは分割/結合アンチパターンを使用していますが、ここではうまく機能しているようです。

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")、同じ番号のすべてのブロックがマージされます。
于 2012-06-06T07:29:59.590 に答える
0

正規表現を使用できますが、Split はうまく機能しません。次のパターンに一致させることができます。

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

例:ここ

で分割しようとしました$(?<=^(\d+).*)[\r\n]+^(?!\1)が、行番号が配列の要素として追加されます。

于 2012-06-06T06:51:01.013 に答える