在C#中,StreamReader的ReadLine方法是不支持自定義行分隔符的。這導致很多文本文件的行分隔符如果不是"\r"和"\n",那么使用StreamReader就無法正確讀取到一行字符串。
所以我們這里采用一個.NET Core控制台項目,自定義一個ReadLineWithDelimiter擴展方法,演示使用自定義的行分隔符,從StreamReader中讀取一行字符串,代碼如下:
using System; using System.IO; using System.Text; namespace NetCoreReadline { /// <summary> /// StreamReader擴展類 /// </summary> public static class StreamReaderExtension { /// <summary> /// 使用自定義的行分隔符,從StreamReader中讀取一行字符串 /// </summary> /// <param name="streamReader">StreamReader類對象實例</param> /// <param name="delimiter">自定義的行分隔符</param> /// <returns>從StreamReader中讀取的一行字符串</returns> public static string ReadLineWithDelimiter(this StreamReader streamReader, string delimiter) { StringBuilder sb = new StringBuilder(); if (delimiter == null) { throw new ArgumentNullException("delimiter"); } if (delimiter == string.Empty && !streamReader.EndOfStream) { return ((char)streamReader.Read()).ToString(); } while (!streamReader.EndOfStream) { char currentChar = (char)streamReader.Read();//如果StreamReader采用的是支持中文的編碼,例如Encoding.UTF8,那么這里讀取到的字符char類型也會是中文,不會是亂碼 sb.Append(currentChar); //表示StreamReader讀取到一個完整的行分隔符了 if (sb.ToString().EndsWith(delimiter)) { sb.Remove(sb.Length - delimiter.Length, delimiter.Length); break; } } return sb.ToString(); } } class Program { static void Main(string[] args) { string filepath = AppDomain.CurrentDomain.BaseDirectory + "Data\\RawData.txt"; using (StreamReader streamReader = new StreamReader(filepath, Encoding.UTF8)) { while (!streamReader.EndOfStream) { string lineText = streamReader.ReadLineWithDelimiter("||");//定義"||"為行分隔符 Console.WriteLine("StreamReader 讀到一行字符串:\"{0}\"", lineText); } } Console.WriteLine("按任意鍵結束程序..."); Console.ReadKey(); } } }
我們在Program類的Main方法中,使用了自定義的行分隔符"||",來從StreamReader中讀取每一行字符串。
其中讀取的文本文件"RawData.txt"為UTF-8編碼,其文本內容如下所示:
昨天天氣不錯ABC||今天天氣不錯EFG||明天天氣不錯HIJ
按照行分隔符"||",該文本文件就有三行字符串。
最終,程序運行的結果,如下所示:
所以,我們可以看到三行字符串都被正確地讀取出來了。
參考文獻:
C# StreamReader, “ReadLine” For Custom Delimiters