我怎样可以使用PowerShell计算CSV文件中行的数量?我尝试了以下方法:
Get-Content -length "C:\Directory\file.csv"
或者(Get-Content).length "C:\Directory\file.csv"
但是这些会导致错误。
我怎样可以使用PowerShell计算CSV文件中行的数量?我尝试了以下方法:
Get-Content -length "C:\Directory\file.csv"
或者(Get-Content).length "C:\Directory\file.csv"
但是这些会导致错误。
使用Get-Content和Measure-Object对于小文件来说还好,但两者在处理大文件时效率极低。我曾遇到过大文件的实际问题。
当使用任一方法计算1GB文件中的行数时,Powershell会占用服务器上所有可用的内存(8GB),然后开始向磁盘进行分页。我将其放置了一个小时,但它仍在向磁盘进行分页,所以我终止了它。
我发现的处理大文件的最佳方法是使用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 变量即可获取文件的行数。
将它管道传递到 Measure-Object
命令
Import-Csv C:\Directory\file.csv | Measure-Object
一般来说(无论是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
Measure-Object
应该返回一个具有属性 Count 的对象。试着移除 |Select-Object ...
,你就会看到它返回的是什么。 - stej你可以在PowerShell中简单地使用类Unix命令。
如果你有一个名为test.csv的文件, 那么获取行数的命令是:
gc test.csv | Measure-Object
(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
OutOfMemoryException
异常。使用 Get-Content | Measure-Object
可以在有限的内存量下工作。 - oɔɯǝɹ
while ($null -ne $reader.ReadLine()) { ... }
,因为比较运算符有时可能像过滤器一样工作。 https://rencore.com/blog/powershell-null-comparison/ - Bacon Bits