web-dev-qa-db-ja.com

PowerShell:csvファイルの行数をカウントする方法は?

Powershellを使用してcsvファイルの行数をカウントするにはどうすればよいですか?私は次のようなものを試しました

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

または

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

しかし、これらはエラーになります。

20
jrara

Measure-Objectコマンドレットにパイプします

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

Get-ContentとMeasure-Objectは小さなファイルには適していますが、どちらもメモリに対して非常に非効率的です。大きなファイルで実際に問題が発生しました。

いずれかの方法を使用して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++ }

上記のスニペットは、get-contentまたはmeasure-objectを使用する場所に挿入できます。$ LinesInFile変数を参照してファイルの行数を取得するだけです。

39
Ten98

一般的に(csvかどうか)

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

ファイルに1行しかない場合、失敗します。 (@プレフィックスが必要です。そうでない場合、ファイルに1行ある場合、その行のcharactersの数のみがカウントされます。

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

ただし、いずれかのレコードが複数の行を使用する場合、両方とも失敗します。次に、csvをインポートして測定します。

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count
7
stej

(Import-Csv C:\Directory\file.csv).countはこれらのうち唯一の正確なものです。

4781行のcsvで他のすべての提案を試みましたが、これ以外は4803を返しました。

0
devonuto

あなたが試すことができます

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

または

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

PowerShellでunix likeコマンドを使用できます。

Test.csvをファイルする場合、行カウントを取得するコマンドは

gc test.csv | Measure-Object
0
Sandeep Bharani