How to read text file by particular line separator character?

后端 未结 9 2008
独厮守ぢ
独厮守ぢ 2020-12-03 00:58

Reading a text file using streamreader.

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
     string line = sr.ReadLine();
}
<         


        
9条回答
  •  死守一世寂寞
    2020-12-03 01:40

    This is an improvement of sovemp answer. Sorry I would have liked to comment, although my reputation doesn't allow me to do so. This improvement addresses 2 issues:

    1. example sequence "text\rtest\r\n" with delimiter "\r\n" would also delete the first "\r" which is not intended.
    2. when last characters in stream equals delimiter, function would wrongly return string including delimiters.

      using System;
      using System.IO;
      using System.Collections.Generic;
      internal static class StreamReaderExtensions
      {
          public static IEnumerable ReadUntil(this StreamReader reader, string delimiter)
          {
              List buffer = new List();
              CircularBuffer delim_buffer = new CircularBuffer(delimiter.Length);
              while (reader.Peek() >= 0)
              {
                  char c = (char)reader.Read();
                  delim_buffer.Enqueue(c);
                  if (delim_buffer.ToString() == delimiter || reader.EndOfStream)
                  {
                      if (buffer.Count > 0)
                      {
                          if (!reader.EndOfStream)
                          {
                              buffer.Add(c);
                              yield return new String(buffer.ToArray()).Substring(0, buffer.Count - delimeter.Length);
                          }
                          else
                          {
                              buffer.Add(c);
                              if (delim_buffer.ToString() != delimiter)
                                  yield return new String(buffer.ToArray());
                              else
                                  yield return new String(buffer.ToArray()).Substring(0, buffer.Count - delimeter.Length);
                          }
                          buffer.Clear();
                      }
                      continue;
                  }
                  buffer.Add(c);
              }
          }
      
          private class CircularBuffer : Queue
          {
              private int _capacity;
      
              public CircularBuffer(int capacity)
                  : base(capacity)
              {
                  _capacity = capacity;
              }
      
              new public void Enqueue(T item)
              {
                  if (base.Count == _capacity)
                  {
                      base.Dequeue();
                  }
                  base.Enqueue(item);
              }
      
              public override string ToString()
              {
                  List items = new List();
                  foreach (var x in this)
                  {
                      items.Add(x.ToString());
                  };
                  return String.Join("", items);
              }
          }
      }
      

提交回复
热议问题