摘要:[筆記]刪除檔案中的前幾筆或是後幾筆
通常的做法是
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