【发布时间】:2011-10-14 21:50:59
【问题描述】:
如何使用 powershell 计算 csv 文件中的行数?我尝试了类似的东西
Get-Content -length "C:\Directory\file.csv"
或
(Get-Content).length "C:\Directory\file.csv"
但这些会导致错误。
【问题讨论】:
标签: command-line powershell csv count powershell-1.0
如何使用 powershell 计算 csv 文件中的行数?我尝试了类似的东西
Get-Content -length "C:\Directory\file.csv"
或
(Get-Content).length "C:\Directory\file.csv"
但这些会导致错误。
【问题讨论】:
标签: command-line powershell csv count powershell-1.0
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++ }
上面的 sn-p 可以插入到任何你会使用 get-content 或 measure-object 的地方,只需参考 $LinesInFile 变量来获取文件的行数。
【讨论】:
$LinesInFile 即可看到数字。
通过管道将其传送到 Measure-Object cmdlet
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 ...,您将看到它返回的内容。
您可以在 powershell 中简单地使用 unix 之类的命令。
如果您归档 test.csv 然后获取行数的命令是
gc test.csv | Measure-Object
【讨论】:
你可以试试
(Import-Csv C:\Directory\file.csv).count
或
$a=Import-Csv C:\Directory\file.csv
$a.count
【讨论】:
OutOfMemoryException。使用Get-Content | Measure-Object 可以在有限的内存中使用..
(Import-Csv C:\Directory\file.csv).count 是其中唯一准确的。
我在 4781 行的 csv 上尝试了所有其他建议,但除此之外的所有建议都返回 4803。
【讨论】: