2010-01-20 14 views
1

我想知道我的文件中有多少行。我怎樣才能以簡單的方式做到這一點(我的意思是,不要遍歷整個文件並計算每一行)?有沒有一個命令?在C中計數文件行#

+0

遍佈整個文件?我們正在談論3行代碼來計算這一點。 – 2010-01-20 16:29:31

回答

9

好:

int lines = File.ReadAllLines(path).Length; 

是相當簡單的,但對於龐大的文本文件不是很有效。我可能會在大多數情況下使用TextReader,以避免過多的緩衝:

int lines = 0; 
using (TextReader reader = File.OpenText(path)) { 
    while (reader.ReadLine() != null) { lines++; } 
} 
+0

坦克!!!! 順便說一句,我用這個爲65500行的文件,所以我認爲它甚至錯誤的文件... – aharon 2010-01-20 16:42:36

4

任何「功能」你打電話是要基本上做同樣的事情 - 通過走行線和計數新行的數量字符。

如果你想讓自己陷入讓更多的東西看起來更「脆」的情況,那麼用一個正則表達式來計算新行字符的數量就可以實現。

+0

一旦你已經讀完整個文件 - 如果它很大,不是真的可行。或者你每行都這樣做......哦,等等......-) – 2010-01-20 16:29:33

+0

我們應該告訴OP,它仍然會讀取整個文件嗎? ;) 我想,如果元數據附加到追蹤行數的文件(它可能只適用於文本文件),那麼你可以閱讀它。但我不認爲存在這樣的事情。 – FrustratedWithFormsDesigner 2010-01-20 16:34:08

0

這樣或那樣的(正則表達式,FileStream等)的東西,某處將不得不通過換行符。

0

取決於線路的長度...通常最快的方法就是做這個用這個簡單的公式 - 獲得以字節爲單位的文件長度和線的長度劃分,例如:

 
const int LINE_LENGTH = 80; 
System.IO.FileInfo f = new System.IO.FileInfo(path); 
int noLines = f.Length/LINE_LENGTH; 

上面假定線的長度是恆定的80個字符寬...

如果長度是可變的,存在從通過每個線打開該文件並重復這樣做,除了沒有其它方式並跟蹤行數。

編輯: 我才意識到一個更簡單的方法後,我貼在下面留言.. 這豈不是更容易實際使用的外殼下System.Diagnostics.Process命名空間使用的參數作爲文件路徑來調用grep -c "$(\r?\n?|\n)"問題 - 這將使它更加靈活,並可以滿足任何文件。你必須做的輸出被讀取和正則表達式,它得到的線路的實際數量,例如,用我的grep與用Borland C來的唯一的事情,我得到這個輸出

 
C:\Documents and Settings\Tom>grep -c "$(\r?\n?)" 273.txt 
File 273.txt: 
35 lines match 

輸出和里程可能會有所不同,-c命令切換到grep意味着'計數'

+0

它採用ASCII或低端UTF8編碼,加上它不考慮換行符本身的長度。 – 2010-01-20 16:37:55

+0

行長是可變的,然後長80字符.. 謝謝反正.. – aharon 2010-01-20 16:38:00

+0

嘿,誰打算實際打開一個+ 65K行文件,計數每一個,然後將其與此代碼的結果進行比較?我說把它放在那裏,如果有人提交錯誤報告,就更改它。 – Will 2010-01-20 16:48:39