我有一个类似于此的重复文本文件,我正在寻找分解为基于'Tx'指示器的单个文件....任何关于如何实现此目的的想法?通过重复关键字分割字符串
Tx1
some data
some data
Tx2
some data
some data
Tx3
some data
some data
我有一个类似于此的重复文本文件,我正在寻找分解为基于'Tx'指示器的单个文件....任何关于如何实现此目的的想法?通过重复关键字分割字符串
Tx1
some data
some data
Tx2
some data
some data
Tx3
some data
some data
1.Load一个文件内容存储为一个字符串
2.使用正则表达式来拆分
string[] lines = Regex.Split(str, "Tx^[0-9]");
3.Save各行不同的文件
可能希望包含一行开始和结束,以防数据中出于某种原因出现Tx5。可能也应该使用'[0-9] +'来支持Tx数字> = 10。 – StriplingWarrior
为什么要将整个文本文件读入内存?这可能非常浪费。 – D3C34C34D
这工作完美!谢谢 – smietanski
你可能会考虑一个潜在更有效的实现,可以在线生成文件,而无需将所有的块都提交到内存中。
鉴于一些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。
'Tx#'是重要的还是只是你的分割点? – Chakrava
文件有多大? – D3C34C34D