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
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変数を参照してファイルの行数を取得するだけです。
一般的に(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
(Import-Csv C:\Directory\file.csv).count
はこれらのうち唯一の正確なものです。
4781行のcsvで他のすべての提案を試みましたが、これ以外は4803を返しました。
あなたが試すことができます
(Import-Csv C:\Directory\file.csv).count
または
$a=Import-Csv C:\Directory\file.csv
$a.count
PowerShellでunix likeコマンドを使用できます。
Test.csvをファイルする場合、行カウントを取得するコマンドは
gc test.csv | Measure-Object