2011-07-28 83 views

回答

25

它管到Measure-Object cmdlet的

Import-Csv C:\Directory\file.csv | Measure-Object 
+2

謝謝,這似乎工作,但它是比較例如慢得要命到GNU Unix utils wc.exe。 – jrara

+1

這是因爲wc.exe將等同於(Get-Content).Length雖然它比Import-CSV快得多,但它也是一個潛在的不正確的解決方案,正如由stej指出的那樣,因爲它不會考慮行多行字段。 – EBGreen

+0

好東西。正是我需要的...... –

6

一般(CSV或沒有)

@(Get-Content c:\file.csv).Length 

如果該文件只有一條線,那麼,它就會失敗。(您需要@前綴......否則,如果文件中有一條線,它只會算在該行字符數。

Get-Content c:\file.csv | Measure-Object -line 

但是,如果任何記錄時間超過一個都將失敗。行然後更好地導入CSV和措施:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count 
+0

最後一個似乎會產生一個錯誤:Select-Object:無法展開屬性「count」,因爲它沒有任何可展開的內容。 在線:1 char:64 + Import-Csv C:\ Directory \ file.csv |度量對象| Select-Object <<<< -expand count – jrara

+0

奇怪的是,'Measure-Object'應返回一個具有Count屬性的對象。嘗試刪除'| Select-Object ...',你會看到它返回的內容。 – stej

+0

您可能正在使用PowerShell v1。在v1中,當結果是標量(一個對象)時,「Select-Object -expand propertyName」會引發錯誤。升級到V2,你很好。 –

31

獲取內容和測量,對象很適合小文件,但兩者都與內存超級低效,我與大文件實際問題

當。數數 使用任何一種方法在1GB文件中進行記錄,Powershell吞併服務器上所有可用的內存(8GB),然後開始分頁到磁盤。我離開了它一個多小時,但它仍然分頁到磁盤,所以我殺了它。

我發現大文件的最佳方法是使用IO.StreamReader從磁盤加載文件並使用變量對每行進行計數。這將內存使用量降低到非常合理的25MB,並且要快得多,需要大約30秒來計算1GB文件中的行或6GB文件中的幾分鐘。它從來不吃了不合理數量的RAM,無論你的文件有多大:

[int]$LinesInFile = 0 
$reader = New-Object IO.StreamReader 'c:\filename.csv' 
while($reader.ReadLine() -ne $null){ $LinesInFile++ } 

上面的代碼中可以插入的地方,你會用得到的內容或措施對象,簡單地參考$ LinesInFile變量獲取文件的行數。

+0

比此處顯示的任何其他解決方案都快。小於5秒可以整理一個500MB的csv文件。 – alextc

+0

您也應該在使用後處理讀者($ reader.Dispose()),否則您可能會打開文件直到您關閉PS會話。 –

0

您可以嘗試

(Import-Csv C:\Directory\file.csv).count 

$a=Import-Csv C:\Directory\file.csv 
$a.count 
+0

我在一個大文件上使用這種方法得到了'OutOfMemoryException'。使用'Get-Content | Measure-Object'適用於有限的內存。 –

0

(Import-Csv C:\Directory\file.csv).count是唯一正確的一個出這些。

我嘗試了所有的其他建議上以CSV 4781行,和所有但這一次回到4803

相關問題