28

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

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

或者

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

但这些会导致错误。

4

6 回答 6

57

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 变量来获取文件的行数。

于 2012-12-21T14:48:19.960 回答
40

将其通过管道传输到Measure-Objectcmdlet

Import-Csv C:\Directory\file.csv | Measure-Object
于 2011-07-28T08:11:28.840 回答
10

一般(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
于 2011-07-28T08:13:00.050 回答
1

您可以在 powershell 中简单地使用类似 unix 的命令。

如果你文件 test.csv 那么获取行数的命令是

gc test.csv | Measure-Object
于 2019-03-17T17:33:58.973 回答
0

(Import-Csv C:\Directory\file.csv).count是其中唯一准确的一个。

我在 4781 行的 csv 上尝试了所有其他建议,但除此之外的所有建议都返回 4803。

于 2013-11-05T00:22:51.950 回答
-1

你可以试试

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

或者

$a=Import-Csv C:\Directory\file.csv
$a.count
于 2013-06-13T09:50:01.297 回答