在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(); bool found = false; while (!found && !streamReader.EndOfStream) { for (int i = 0; i < delimiter.Length; i++) { char c = (char)streamReader.Read();//如果StreamReader采用的是支持中文的编码,例如Encoding.UTF8,那么这里读取到的字符char类型也会是中文,不会是乱码 sb.Append(c); if (c != delimiter[i]) break; //表示读取到一个完整的行分隔符了 if (i == delimiter.Length - 1) { sb.Remove(sb.Length - delimiter.Length, delimiter.Length); found = true; } } } 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
来源:https://www.cnblogs.com/OpenCoder/p/12298475.html