Вы могли бы рассмотреть потенциально более эффективную реализацию, которая генерирует файлы в режиме онлайн без необходимости передавать все куски в память.
Учитывая некоторые 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]
случае (обратите внимание, это может быть легко заменена регулярным выражением):
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