码迷,mamicode.com
首页 > 其他好文 > 详细

使用自定义的行分隔符,从StreamReader中读取一行字符串

时间:2020-02-12 13:13:53      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:mic   stack   space   完整   一个   abc   console   etc   ref   

在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

 

使用自定义的行分隔符,从StreamReader中读取一行字符串

标签:mic   stack   space   完整   一个   abc   console   etc   ref   

原文地址:https://www.cnblogs.com/OpenCoder/p/12298475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!