2016-05-13 2 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.Use RegEx расколоть

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

3.Save каждая строка другой файл

+4

Наверное, хотите включить начало и конец строки, если у некоторых из них есть Tx5 по какой-то причине. Вероятно, также следует использовать '[0-9] +' для поддержки Tx numbers> = 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] случае (обратите внимание, это может быть легко заменена регулярным выражением):

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.

Смежные вопросы