[筆記]刪除檔案中的前幾筆或是後幾筆

  • 2856
  • 0

摘要:[筆記]刪除檔案中的前幾筆或是後幾筆

通常的做法是

1.用FileStream,用迴圈控制寫入需要的資料到另一個檔,再把原來的檔砍掉
   這做法還要去判斷是否遇到分行符號,這做法感覺很累也很不聰明就跳了0.0

2.用StreamReader,ReadLine可以一筆一筆讀,一樣寫入另個檔,跳過不需要的行數
   這做法可以控制要保留那些行數


        /// 
        /// 取出檔案中設定的行數
        /// 
        ///來源檔案
        ///輸出檔案
        ///第幾行開頭
        ///第幾行結束
        public static void FileCutLines(string source, string output, int start, int end)
        {
            try
            {
                string line = string.Empty;
                int line_number = 0;
                
                using (StreamReader reader = new StreamReader(source))
                {
                    using (StreamWriter writer = new StreamWriter(output))
                    {
                        while ((line = reader.ReadLine()) != null)
                        {
                            line_number++;

                            if (line_number < start) continue;

                            if (line_number > end) continue;

                            writer.WriteLine(line);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

 

3.用File.ReadAllLines,利用IEnumerable.Take<>,可以傳回前幾筆
   這做法的程式碼會比較精簡,不過只取從開頭開始的幾筆,要自己加工


        /// 
        /// 刪除檔案中最後行數
        /// 
        ///
        ///
        public void FileCutLastLine(string source, string output, int count)
        {
            var lines = File.ReadAllLines(source);
            File.WriteAllLines(output, lines.Take(lines.Length - count).ToArray());
        }

        /// 
        /// 刪除檔案中前面行數
        /// 
        ///
        ///
        public void FileCutFirstLine(string source, string output, int count)
        {
            var lines = File.ReadAllLines(source);
            var lines2 = lines.Reverse().ToArray();

            File.WriteAllLines(output, lines2.Take(lines2.Length - count).Reverse().ToArray());
        }

 

既然有兩種方法,就會想到到底哪種方法的效率會比較好
下面就做個實驗

檔案大小:1.15MB
Lines:19886
1000次

  方法2 方法3
刪除最後兩筆 57.0 37.812
刪除前兩筆 58.688 42.31

取第二筆到倒數前兩筆
(刪前兩筆跟最後兩筆)

56.813 76.32(59.938)

由以上數據來看,

如果只是單純地去頭還是去尾用方法3是比較快的
畢竟方法2要跑迴圈

但是如果要取中間段則是方法2比較快
因為用方法3變成要處理兩次所以時間就拖長了
不過為了怕是IO影響到時間,所以另外把兩個動作合併
 


        /// 
        /// 取出檔案中設定的行數
        /// 
        ///來源檔案
        ///輸出檔案
        ///第幾行開頭
        ///第幾行結束
        public void FileCutLines2(string source, string output, int start, int end)
        {
            var lines = File.ReadAllLines(source);
            var lines2 = lines.Take(end).Reverse().ToArray();

            File.WriteAllLines(output, lines2.Take(lines2.Length - start).Reverse().ToArray());
        }

時間就是括弧內的數字,有改善一點不過還是略遜方法2