2011-07-28 200 views
15

powershellを使用してcsvファイルの行数をカウントするにはどうすればよいですか?私はPowerShell:csvファイルの行数をカウントする方法は?

Get-Content -length "C:\Directory\file.csv" 

または

(Get-Content).length "C:\Directory\file.csv" 

が、これらの結果、エラーのようなものを試してみました。一般Measure-Objectレット

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

答えて

25

パイプそれは、それから、それは失敗します。(あなたがそうでなければ、ファイルは1行を持っている場合、それだけ文字その行のの数をカウントします。

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

... @接頭辞を必要とするしかし、どのレコードが複数のかかる場合の両方が失敗します行その後、より良いインポートCSVと対策:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count 
+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 

ファイルは一つだけの行がある場合に

+0

最後にエラーが発生しているようです。Select-Object:展開しないため「count」プロパティを展開できません。 行目:1 char:64 + Import-Csv C:¥Directory¥file.csv | Measureオブジェクト| Select-Object <<<< -expand count – jrara

+0

奇妙な 'Measure-Object'はCountというプロパティを持つオブジェクトを返さなければなりません。 '| Select-Object ... 'を削除しようとすると、それが何を返すかがわかります。 – stej

+0

あなたはおそらくPowerShell v1を使用しています。 v1では、 'Select-Object -expand propertyName'は結果がスカラー(1つのオブジェクト)であるときにエラーをスローします。 v2にアップグレードすれば、あなたはうまく行きます。 –

31

のGet-コンテンツおよび測定・オブジェクトを小さなファイルの罰金ですが、両方ともメモリで超非効率的である私は、大容量のファイルを持つ本当の問題を抱えていた

とき。数えるどの方法を使っても1GBファイル内の行になり、Powershellはサーバー上の使用可能なすべてのメモリ(8GB)を突っ込み、ディスクへのページングを開始しました。私は1時間以上それを残しましたが、それはまだディスクにページングしていましたので、私はそれを殺しました。

大容量ファイルで最も良い方法は、IO.StreamReaderを使用してディスクからファイルをロードし、変数を使用して各ローをカウントすることです。これにより、メモリ使用量は25MBと非常に妥当なものになります.1GBファイルで行を数えるのに30秒かかります.6GBファイルでは数分かかります。それは関係なく、あなたのファイルがどのように大規模な、RAMの不合理な量を食べることはありません:

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

あなたが得るコンテンツまたはメジャー・オブジェクトを使用することになりどこ上記のスニペットを挿入することができ、単純に$ LinesInFile変数を参照してください。ファイルの行数を取得します。

+0

ここに示す他のソリューションよりも高速です。 500MBのcsvファイルを整理するのに5秒未満です。 – alextc

+0

また、使用後にreader($ 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を試すことができます。

私は4781行のCSV上の他の提案のすべて、およびすべてを試みたが、この1つは4803.

関連する問題