2016-05-13 13 views
3

Ich habe eine sich wiederholende Textdatei, die ich in einzelne Dateien auf der Grundlage der "Tx" -Anzeige aufteilen möchte ... Irgendwelche Gedanken darüber, wie ich das erreichen könnte?Split-String durch wiederholtes Schlüsselwort

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

Sind die 'Tx #' s wichtig oder nur Ihre Splitpunkte? – Chakrava

+0

Wie groß ist die Datei? – D3C34C34D

Antwort

5

1.Laden eine der Dateiinhalt in den Speicher als String

2.Use RegEx

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

3.Save jede Zeile verschiedene Datei

+4

Wahrscheinlich möchten Sie einen Zeilenanfang und -ende einschließen, falls die Daten aus irgendeinem Grund eine Tx5 enthalten. Wahrscheinlich sollten Sie auch '[0-9] +' verwenden, um Tx-Nummern> = 10 zu unterstützen. – StriplingWarrior

+2

Warum die ganze Textdatei in den Speicher lesen? Dies ist möglicherweise sehr verschwenderisch. – D3C34C34D

+1

Das hat perfekt funktioniert! Vielen Dank – smietanski

0

Sie teilen sich anschauen sollten eine potenziell effizientere Implementierung, die Dateien online generiert, ohne alle Blöcke in den Speicher zu schreiben.

Da einige 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(); 
} 

Sie können alle Ihre Dateien in einem einzigen Durchgang aufzubauen. Legen Sie einige predicate function, die für Ihre Tx^[0-9] Fall true zurück (man beachte dies leicht mit einem regulären Ausdruck ersetzt werden kann):

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

Ein Algorithmus direkt mit dem IEnumerator Umgang:

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(); 
     } 
    } 
} 

ich setzen Arbeitsbeispiel on Github.

Verwandte Themen