How to read a text file reversely with iterator in C#

后端 未结 11 1868
甜味超标
甜味超标 2020-11-22 04:05

I need to process a large file, around 400K lines and 200 M. But sometimes I have to process from bottom up. How can I use iterator (yield return) here? Basically I don\'t l

11条回答
  •  别跟我提以往
    2020-11-22 04:33

    I know this post is very old but as I couldn't find how to use the most voted solution, I finally found this: here is the best answer I found with a low memory cost in VB and C#

    http://www.blakepell.com/2010-11-29-backward-file-reader-vb-csharp-source

    Hope, I'll help others with that because it tooks me hours to finally find this post!

    [Edit]

    Here is the c# code :

    //*********************************************************************************************************************************
    //
    //             Class:  BackwardReader
    //      Initial Date:  11/29/2010
    //     Last Modified:  11/29/2010
    //     Programmer(s):  Original C# Source - the_real_herminator
    //                     http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/9acdde1a-03cd-4018-9f87-6e201d8f5d09
    //                     VB Converstion - Blake Pell
    //
    //*********************************************************************************************************************************
    
    using System.Text;
    using System.IO;
    public class BackwardReader
    {
        private string path;
        private FileStream fs = null;
        public BackwardReader(string path)
        {
            this.path = path;
            fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            fs.Seek(0, SeekOrigin.End);
        }
        public string Readline()
        {
            byte[] line;
            byte[] text = new byte[1];
            long position = 0;
            int count;
            fs.Seek(0, SeekOrigin.Current);
            position = fs.Position;
            //do we have trailing rn?
            if (fs.Length > 1)
            {
                byte[] vagnretur = new byte[2];
                fs.Seek(-2, SeekOrigin.Current);
                fs.Read(vagnretur, 0, 2);
                if (ASCIIEncoding.ASCII.GetString(vagnretur).Equals("rn"))
                {
                    //move it back
                    fs.Seek(-2, SeekOrigin.Current);
                    position = fs.Position;
                }
            }
            while (fs.Position > 0)
            {
                text.Initialize();
                //read one char
                fs.Read(text, 0, 1);
                string asciiText = ASCIIEncoding.ASCII.GetString(text);
                //moveback to the charachter before
                fs.Seek(-2, SeekOrigin.Current);
                if (asciiText.Equals("n"))
                {
                    fs.Read(text, 0, 1);
                    asciiText = ASCIIEncoding.ASCII.GetString(text);
                    if (asciiText.Equals("r"))
                    {
                        fs.Seek(1, SeekOrigin.Current);
                        break;
                    }
                }
            }
            count = int.Parse((position - fs.Position).ToString());
            line = new byte[count];
            fs.Read(line, 0, count);
            fs.Seek(-count, SeekOrigin.Current);
            return ASCIIEncoding.ASCII.GetString(line);
        }
        public bool SOF
        {
            get
            {
                return fs.Position == 0;
            }
        }
        public void Close()
        {
            fs.Close();
        }
    }
    

提交回复
热议问题