PowerShell:如何计算csv文件中的行数?

jra*_*ara 20 csv powershell command-line count powershell-1.0

如何使用powershell计算csv文件中的行数?我试过类似的东西

Get-Content -length "C:\Directory\file.csv"
Run Code Online (Sandbox Code Playgroud)

要么

(Get-Content).length "C:\Directory\file.csv"
Run Code Online (Sandbox Code Playgroud)

但这些都会导致错误.

Ten*_*n98 40

Get-Content和Measure-Object适用于小文件,但两者都对内存效率极低.我有大文件的真正问题.

当使用任一方法计算1GB文件中的行时,Powershell吞噬服务器上的所有可用内存(8GB),然后开始分页到磁盘.我离开它超过一个小时,但它仍然分页到磁盘所以我杀了它.

我找到的大文件的最佳方法是使用IO.StreamReader从磁盘加载文件并使用变量计算每一行.这样可以将内存使用量降低到非常合理的25MB,而且速度要快得多,大约需要30秒来计算1GB文件中的行数,或者花费几分钟来计算6GB文件.无论你的文件有多大,它都不会占用不合理数量的RAM:

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

可以在使用get-content或measure-object的任何地方插入上面的代码段,只需引用$ LinesInFile变量来获取文件的行数.

  • 您还应该在使用后丢弃阅读器($ reader.Dispose()),否则您可能会在关闭PS会话之前保持文件打开. (2认同)
  • 如果使用 powershell,请在上面的块末尾添加“write-output $LinesInFile”以获取屏幕上的值。 (2认同)

Sha*_*evy 28

将其传递给Measure-Objectcmdlet

Import-Csv C:\Directory\file.csv | Measure-Object
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这似乎有效,但与GNU Unix utils wc.exe相比,速度非常慢. (3认同)
  • 那是因为 wc.exe 相当于 (Get-Content).Length 虽然它比 Import-CSV 快得多,但正如 stej 指出的那样,它也是一个可能不正确的解决方案,因为它不会考虑多行的行领域。 (3认同)
  • (一个 100 MB 的文件需要大约 1 分钟) (3认同)

ste*_*tej 7

一般(csv与否)

@(Get-Content c:\file.csv).Length
Run Code Online (Sandbox Code Playgroud)

如果文件只有一行,那么它将失败.(您需要@前缀...否则,如果文件有一行,则只计算该行中的字符数.

Get-Content c:\file.csv | Measure-Object -line
Run Code Online (Sandbox Code Playgroud)

但如果任何记录占用多行,则两者都将失败.然后更好地导入csv并测量:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count
Run Code Online (Sandbox Code Playgroud)

  • 我只检查PowerShell标签.并默默地假设没有人使用v1.0.抱歉:) (2认同)