在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