通过重复关键字拆分字符串

时间:2016-05-13 22:42:21

标签: c#

我有一个类似于此的重复文本文件,我希望根据'Tx'指示符将其分解为单个文件....有关如何实现此目的的任何想法?

Tx1
some data 
some data
Tx2
some data 
some data
Tx3
some data 
some data

2 个答案:

答案 0 :(得分:5)

1.将文件内容作为字符串

添加到内存中

2.使用RegEx拆分

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

3.保存每行不同的文件

答案 1 :(得分: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