2014-03-04 60 views
28

我下面這個article拆分文本與 ' r n'

,我想出了這個代碼:

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

下面是示例文本:

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

這裏是輸出:

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 

但我想是這樣的:

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

我想我應該得到這樣的結果,但不知何故,我失去了一些東西......

+2

爲什麼不使用'File.ReadAllLines'或'File.ReadLines'? –

+0

'Console.WriteLine()'會在數組中的每個字符串之後自動添加換行符。你想要在你的循環之前把這些行合併在一起,或者如你所建議的一個答案那樣,在'分割'文本之前替換'\ n'。 –

+0

我想要具有以'\ r \ n'而不是'\ n'或'\ r'結尾的行。 – skmasq

回答

39

問題不在於分裂而在於WriteLine。用WriteLine打印的字符串中的\n將產生「額外」行。

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. 
} 

要解決該問題,請刪除您\n打印字符串之前。

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

是的,'Console.WriteLine()'是將'\ n'翻譯成'\ r \ n'。 – skmasq

1

讀文件更容易與靜態File類完成:

// 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', ' ')); 
} 

注意:該文本可能還包含垂直製表符\v。這些被Microsoft Word用作手動換行符。

爲了抓住任何可能的一種休息,你可以使用正則表達式替換

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

我認爲這個問題是在文本文件中。它可能已經被分割成許多行,當你閱讀它時,它會「添加」額外的\r和/或\n個字符(因爲它們存在於文件中)。檢查你讀到的變量是text

下面的代碼(與您的文本的局部變量)工作正常,並分成2行:

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

但是我爲什麼要添加它? – Szymon

1

這爲我工作。

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

。第一替代替換從文本文件中的新行\r\n,第二個代替實際\r\n文本時被讀取的文件轉換爲\\r\\n。 (當文件被讀取時\變成\\)。

2

我採取了更緊湊的方法來將文本區域的輸入分割爲字符串列表。如果適合你的目的,你可以使用它。

問題是你不能用\ r \分裂ñ所以我刪除了\ n事先並只能由\ r

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

拆分我喜歡這種方法,因爲你可以在短短的一行做到這一點。

2

這對我有效。

using System.IO; 

// 

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