2014-03-04 6 views
28

Ich war nach diesem articleSplit Text mit ' r n'

Und ich kam mit diesem Code auf:

string FileName = "C:\\test.txt"; 

using (StreamReader sr = new StreamReader(FileName, Encoding.Default)) 
{ 
    string[] stringSeparators = new string[] { "\r\n" }; 
    string text = sr.ReadToEnd(); 
    string[] lines = text.Split(stringSeparators, StringSplitOptions.None); 
    foreach (string s in lines) 
    { 
     Console.WriteLine(s); 
    } 
} 

Hier der Beispieltext wird:

somet interesting text\n 
some text that should be in the same line\r\n 
some text should be in another line 

Hier ist die Ausgabe:

somet interesting text\r\n 
some text that should be in the same line\r\n 
some text should be in another line\r\n 

Aber was ich will, ist dies:

somet interesting textsome text that should be in the same line\r\n 
some text should be in another line\r\n 

Ich denke, dass ich dieses Ergebnis erhalten sollte, aber irgendwie ich bin etwas fehlt ...

+2

Warum verwenden Sie nicht 'File.ReadAllLines' oder' File.ReadLines'? –

+0

'Console.WriteLine()' fügt den Zeilenumbruch automatisch nach jeder Zeichenfolge in Ihrem Array hinzu. Sie möchten entweder die Zeilen vor der Schleife zusammenführen, oder, wie eine Antwort vorgeschlagen hat, ersetzen Sie das '\ n', bevor Sie den Text" Split ". –

+0

Ich möchte eine Zeile haben, die speziell mit '\ r \ n' nicht '\ n' oder' \ r' endet. – skmasq

Antwort

39

Das Problem ist nicht mit der Spaltung sondern mit der WriteLine. Eine \n in einer Zeichenkette, die mit WriteLine gedruckt wird, erzeugt eine "Extra" -Linie.

Beispiel

var text = 
    "somet interesting text\n" + 
    "some text that should be in the same line\r\n" + 
    "some text should be in another line"; 

string[] stringSeparators = new string[] { "\r\n" }; 
string[] lines = text.Split(stringSeparators, StringSplitOptions.None); 
Console.WriteLine("Nr. Of items in list: " + lines.Length); // 2 lines 
foreach (string s in lines) 
{ 
    Console.WriteLine(s); //But will print 3 lines in total. 
} 

das Problem zu beheben \n entfernen, bevor Sie die Zeichenfolge zu drucken.

Console.WriteLine(s.Replace("\n", "")); 
+0

Ja, 'Console.WriteLine()' hat '\ n' in' \ r \ n' übersetzt. – skmasq

1

die Datei Lesen einfacher ist mit der statischen File Klasse getan:

// First read all the text into a single string. 
string text = File.ReadAllText(FileName); 

// Then split the lines at "\r\n". 
string[] stringSeparators = new string[] { "\r\n" }; 
string[] lines = text.Split(stringSeparators, StringSplitOptions.None); 

// Finally replace lonely '\r' and '\n' by whitespaces in each line. 
foreach (string s in lines) { 
    Console.WriteLine(s.Replace('\r', ' ').Replace('\n', ' ')); 
} 

Hinweis: Der Text könnte auch vertikale Tabulatoren enthalten \v. Diese werden von Microsoft Word als manuelle Zeilenumbrüche verwendet.

Um jede mögliche Art von Pausen zu fangen, könnte man regex für den Ersatz

Console.WriteLine(Regex.Replace(s, @"[\f\n\r\t\v]", " ")); 
3

Ich denke, das Problem ist in der Textdatei verwenden. Es ist wahrscheinlich bereits in zu viele Zeilen aufgeteilt und wenn Sie es lesen, fügt es zusätzliche \r und/oder \n Zeichen hinzu (wie sie in der Datei existieren). Überprüfen Sie, was in text Variablen gelesen wird.

Der Code (auf einer lokalen Variablen mit Ihrem Text) funktioniert gut und teilt sich in zwei Linien:

string[] stringSeparators = new string[] { "\r\n" }; 
string text = "somet interesting text\nsome text that should be in the same line\r\nsome text should be in another line"; 
string[] lines = text.Split(stringSeparators, StringSplitOptions.None); 
+0

Aber warum sollte ich es hinzufügen? – Szymon

1

Das ist für mich gearbeitet.

string stringSeparators = "\r\n"; 
string text = sr.ReadToEnd(); 
string lines = text.Replace(stringSeparators, ""); 
lines = lines.Replace("\\r\\n", "\r\n"); 
Console.WriteLine(lines); 

Die erste ersetzen ersetzt die \r\n aus der neuen Linien der Textdatei und die zweiten ersetzt den tatsächlichen \r\n Text, der zu \\r\\n umgewandelt wird, wenn die Dateien gelesen wird. (Wenn die Datei gelesen wird, wird \ zu \\).

2

Ich nahm einen kompakteren Ansatz, um eine Eingabe, die aus einem Textbereich resultierte, in eine String-Liste aufzuteilen. Sie können dies verwenden, wenn es Ihrem Zweck entspricht.

das Problem ist, dass Sie nicht durch \ r \ aufspalten n so entfernte ich die \ n vorher und geteilt nur durch \ r

var serials = model.List.Replace("\n","").Split('\r').ToList<string>(); 

ich diesen Ansatz mag, weil man es in nur eine Zeile tun.

2

Das funktionierte für mich.

using System.IO; 

// 

    string readStr = File.ReadAllText(file.FullName);   
    string[] read = readStr.Split(new char[] {'\r','\n'},StringSplitOptions.RemoveEmptyEntries);