添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

How can I count the number of rows in a csv file using powershell? I tried something like

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

but these result an error.

Thanks, this seems to work, but it is terribly slow compared e.g. to GNU Unix utils wc.exe. – jrara Jul 28 '11 at 8:42 That is because wc.exe would be the equivalent of (Get-Content).Length which while it is much faster than Import-CSV, it is also a potentially incorrect solution as pointed out by stej since it would not account for rows with multiline fields. – EBGreen Jul 28 '11 at 13:48

Get-Content and Measure-Object are fine for small files, but both are super inefficient with memory. I had real problems with large files.

When counting rows in a 1GB file using either method, Powershell gobbled up all available memory on the server (8GB), then started paging to disk. I left it over an hour, but it was still paging to disk so I killed it.

The best method I found for large files is to use IO.StreamReader to load the file from disk and count each row using a variable. This keeps memory usage down to a very reasonable 25MB and is much, much quicker, taking around 30 seconds to count rows in a 1GB file or a couple of minutes for a 6GB file. It never eats up unreasonable amounts of RAM, no matter how large your file is:

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

The above snippet can be inserted wherever you would use get-content or measure-object, simply refer to the $LinesInFile variable to get the row count of the file.

Faster than any other solutions shown here. Less than 5 seconds to sort out a 500mb csv file. – alextc Jul 15 '14 at 23:47 You also should dispose reader ($reader.Dispose()) after use or you risk holding file opened until you close your PS session. – Oleh Nechytailo Aug 11 '16 at 11:06 If using powershell add "write-output $LinesInFile" at end of block above to get the value on screen. – Matt M May 14 '18 at 15:36

If the file has only one line, then, it will fail. (You need the @ prefix...otherwise if the file has one line, it will only count the number of characters in that line.

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

But both will fail if any record takes more than one row. Then better import csv and measure:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count
                Last one seems to generate an error: Select-Object : Cannot expand property "count" because it has nothing to expand. At line:1 char:64 + Import-Csv C:\Directory\file.csv | Measure-Object | Select-Object  <<<< -expand count
                    – jrara
                Jul 28 '11 at 8:41
                Weird, Measure-Object should return an object that has a property Count. Try to remove the |Select-Object ... and you will see what it returns.
                    – stej
                Jul 28 '11 at 8:44
                You're probably using PowerShell v1. In v1, 'Select-Object -expand propertyName' throws an error when the result is a scalar (one object). Upgrade to v2 and you're good to go.
                    – Shay Levy
                Jul 28 '11 at 8:44
                I get an OutOfMemoryException using this approach on a large file. Using Get-Content | Measure-Object works with a limited amount of memory..
                    – oɔɯǝɹ
                Oct 13 '15 at 8:49
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.

site design / logo © 2019 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2019.9.26.35031