2016-05-13 35 views
3

我有一个类似于此的重复文本文件,我正在寻找分解为基于'Tx'指示器的单个文件....任何关于如何实现此目的的想法?通过重复关键字分割字符串

Tx1 
some data 
some data 
Tx2 
some data 
some data 
Tx3 
some data 
some data 
+0

'Tx#'是重要的还是只是你的分割点? – Chakrava

+0

文件有多大? – D3C34C34D

回答

5

1.Load一个文件内容存储为一个字符串

2.使用正则表达式来拆分

string[] lines = Regex.Split(str, "Tx^[0-9]"); 

3.Save各行不同的文件

+4

可能希望包含一行开始和结束,以防数据中出于某种原因出现Tx5。可能也应该使用'[0-9] +'来支持Tx数字> = 10。 – StriplingWarrior

+2

为什么要将整个文本文件读入内存?这可能非常浪费。 – D3C34C34D

+1

这工作完美!谢谢 – smietanski

0

你可能会考虑一个潜在更有效的实现,可以在线生成文件,而无需将所有的块都提交到内存中。

鉴于一些IEnumerator

static IEnumerator<string> DataStream() 
{ 
    var original = "Tx1\nsome data1\nsome data2\nTx2\nsome data3\nsome data4\nTx3\nsome data5\nsome data6\nTx4\nTx5"; 
    Console.WriteLine("Original: {0}", original); 
    return ((IEnumerable<string>) original.Split('\n')).GetEnumerator(); 
} 

您可以构建所有的文件在一个单一的通行证。设置一些predicate function,对于您的Tx^[0-9]情况下返回true(注意,这可以很容易地用正则表达式替换):

Func<string, bool> isDelimiterString = token => 
    token.Length > 2 
    && token[0] == 'T' 
    && token[1] == 'x'; 

直接与IEnumerator处理的算法是:

var enumerable = DataStream(); 
var enumeratorHasNext = enumerable.MoveNext(); 
while (enumeratorHasNext) 
{ 
    var delimiter = enumerable.Current; 
    using (var file = new StreamWriter(delimiter + ".txt")) 
    { 
     enumeratorHasNext = enumerable.MoveNext(); 
     while (enumeratorHasNext && !isDelimiterString(enumerable.Current)) 
     { 
      file.WriteLine(enumerable.Current); 
      enumeratorHasNext = enumerable.MoveNext(); 
     } 
    } 
} 

我把工作示例on Github