20200525小記——C#讀寫大文件

C#讀取一定規則的TXT文本文件時,可以一次性讀入內存中再來轉換成需要的格式,但有些文件太大,並不能使用StreamReader函數一次性讀取,一次性讀取方式:

using (System.IO.StreamReader sr = new System.IO.StreamReader(path, Encoding.Default))//
            {
                lines = sr.ReadToEnd().Split(split1, StringSplitOptions.RemoveEmptyEntries);//
            }

之前寫的原文鏈接:https://blog.csdn.net/yewuzhitou/article/details/95300593

文件一行一行存儲在string[] lines中,這次記錄一種可以讀取大文件的方法——多行逐步讀取txt文本文件。

public static void ReadBigFile(string filePath,out List<point> l,int LineNum=1000000)
        {
            Encoding _encoding = Encoding.Default;
            l = new List<point>();
            char[] split = new char[] { ' ', ';', };
            int sumLineNum = 0;
            while (true)
            {
                try
                {
                    var lines = File.ReadLines(filePath, _encoding).Skip(sumLineNum ).Take(LineNum);
                    sumLineNum += LineNum;
                    int i = 0;
                    foreach (var line in lines)
                    {
                        i = 1;
                        string[] items = line.Split(split);
                        {
                            try
                            {
                                pointa = new point();
                                if (items.Length == 4)
                                {
                                    a.X = Convert.ToDouble(items[0]);
                                    a.Y = Convert.ToDouble(items[1]);
                                    a.Z = Convert.ToDouble(items[2]);
                                    a.Color = Convert.ToByte(items[3]);
                                }
                                else if (items.Length == 3)
                                {
                                    a.X = Convert.ToDouble(items[0]);
                                    a.Y = Convert.ToDouble(items[1]);
                                    a.Z = Convert.ToDouble(items[2]);
                                }
                                else if (items.Length == 2)
                                {
                                    a.X = Convert.ToDouble(items[0]);
                                    a.Y = Convert.ToDouble(items[1]);
                                }
                                l.Add(a);
                            }
                            catch { }
                        }
                    }
                    if (i == 0) break;
                }
                catch { break; }
            }
        }

這裏點雲數據的格式如下:

public class point{
    public double X{get;set;}
    public double Y{get;set;}
    public double Z{get;set;}
    public byte Color{get;set;}
}

通過設置每次讀取的行數LineNum實現對大文件格式txt文本的讀寫,設置的LineNum大寫讀取次數較少相對讀取較快,而且LineNum大於文件的行數也不會報錯,因此這裏設置一次標記 i 來跳出循環。

    2020年5月25日小記 星期一

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章