2010-11-30 11 views
6

Meine Frage ist ziemlich einfach. Ich muss alle Textzeilen aus der Windows-Textdatei holen. Alle Zeilen sind durch \ r \ n Symbole getrennt. Ich benutze String.Split, aber es ist nicht cool, weil es nur "durch ein Symbol" spaltet leere Zeichenfolge, die ich mit Optionsflag entfernen muss. Gibt es einen besseren Weg?So teilen Sie Zeilen von Windows-Textdatei (/ r/n Trennung)

Meine Implementierung

string wholefile = GetFromSomeWhere(); 

// now parsing 
string[] lines = operationtext.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

// ok now I have lines array 

UPDATE

File.ReadAllXXX ist zwecklos hier Coz GetFromSomeWhere RegEx ist eigentlich, so habe ich keine Datei nach diesem Punkt.

+0

definitiv überprüfen Sie diese [Vorschlag] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 " Code-Review"). Es ist fast da, braucht nur ein wenig mehr Unterstützung :) – greatwolf

Antwort

15

Sie this overload von String.Split verwenden können, verwenden, die ein Array von Strings nimmt, die als Trennzeichen dienen kann: Von

string[] lines = operationtext.Split(new[] { Environment.NewLine }, 
            StringSplitOptions.RemoveEmptyEntries); 

natürlich, wenn Sie bereits den Dateipfad haben, ist es viel einfacher zu verwenden File.ReadAllLines:

string[] lines = File.ReadAllLines(filePath); 
+1

Kann nicht verwenden, aber was ist, wenn ich in Reflector sehe, was es tut –

+1

@Captain Comic: Um Ihre Frage zu beantworten, auf .NET 3.5, kann ich sehen, dass 'File.ReadAllLines' verwendet einen 'StreamReader', um die Datei zeilenweise zu lesen und jede Zeile in eine' ArrayList' zu laden. Mit der Methode 'ArrayList.ToArray' wird daraus ein String-Array. – Ani

+0

@Captain Comic: Sie sagen "kann nicht verwenden" ohne zu erklären, warum. Ich verstehe nicht, warum eine oder beide Methoden nicht genau das machen, wonach Sie fragen. –

4

String.Split akzeptiert eine Zeichenfolge (wie "\ r \ n"). Nicht nur ein Chararray.

string[] lines = wholetext.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 
3

könnten Sie eine Erweiterungsmethode wie die Verwendung unten und Ihr Code würde dann so aussehen:

var lines = operationText.ReadAsLines(); 

Erweiterung Methode Umsetzung:

public static IEnumerable<string> ReadAsLines(this string text) 
    { 
     TextReader reader = new StringReader(text); 
     while(reader.Peek() >= 0) 
     { 
      yield return reader.ReadLine(); 
     } 
    } 

Ich vermute, es ist nicht so performant wie die Split-Option, die in der Regel sehr performant ist, aber wenn das kein Problem ist ...