2012-06-07 68 views
3

我有一個修剪目錄中所有文件中的所有文本的功能。以下是代碼在所有文件中修剪文本的最快方法

var dbtables = System.IO.Directory.GetFiles(db); 

foreach(var table in dbtables) 
{ 
    string text = File.ReadAllText(table); 
    File.WriteAllText(table, text.Trim()); 
} 

該目錄中有許多大文件,大約需要30分鐘才能完成。你知道更快的方法來做到這一點嗎?

+4

這可能是更受I/O限制的驅動器比你的代碼... – vcsjones

+0

我高度懷疑有這樣做的更快的方法。你必須閱讀和寫入文件才能修剪,那麼你還有什麼要提高性能? @vcsjones也很重要。獲取SSD :) – evanmcdonnal

+1

您應該運行一個分析器並查看正在採取的時間。這很可能在磁盤I/O中,儘管您可以通過自己修剪文件來縮短調用「Trim()」所花費的時間。 'Trim()'將會創建一個可能是一個非常大的字符串的新副本,因此保存該副本可以爲您節省*一些*時間。但請先介紹一下。 – dlev

回答

2

這裏就是我建議做的每個文件:

  1. 閱讀的第一個字符。

  2. 如果是空格,則必須重寫整個文件。

    1. 將整個文件讀入內存。
    2. 從頭開始逐個字符地查找第一個非空白字符。
    3. 從末尾遍歷字符,查找第一個非空白字符。
    4. 尋找到文件的開頭。
    5. 只將字符串的中間字符寫入文件。
    6. 將文件長度設置爲您寫入的字符數。
  3. 如果第一個字符不是空格,那麼您將不會修剪開始,因此您可以截斷結尾。

    1. 逐個字符地逐個讀取文件,直到找到不是空格的字符。
    2. 如果您找到了空格,請將該文件的長度設置爲當前長度減去空格字符的數量。
0

您的代碼當前會修整每個整個文件的開頭和結尾的空格,而不是每行。如果要修剪以每線的基礎上的空白,你可以使用:

var dbtables = System.IO.Directory.GetFiles(db); 

foreach (string table in dbtables) 
{ 
    string temp = table + ".tmp"; 
    using (StreamWriter target = new StreamWriter(temp)) 
     foreach (string line in File.ReadLines(table)) 
      target.WriteLine(line.Trim()); 

    File.Delete(table); 
    File.Move(temp, table); 
} 
+2

如何修剪每條線並不是他的問題。 – vcsjones

+0

說實話,我想演示如何使用一種懶惰枚舉方法(如ReadLines),而不是將整個文件讀入內存,例如OP的ReadAllText。但後來我意識到'TrimEnd'部分不可能在沒有事先讀取文件的情況下實現。 – Douglas

相關問題