【问题标题】:PowerShell: how to count number of rows in csv file?PowerShell:如何计算 csv 文件中的行数?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 比此处显示的任何其他解决方案都快。不到 5 秒就可以整理出一个 500mb 的 csv 文件。
    • 您还应该在使用后丢弃阅读器 ($reader.Dispose()),否​​则您可能会在关闭 PS 会话之前保留打开的文件。
    • 如果使用 powershell 在上面的块末尾添加“write-output $LinesInFile”以获取屏幕上的值。
    • 只需在末尾添加$LinesInFile 即可看到数字。
    • 如果我需要获取文件夹中文件列表的计数,那太好了。我该怎么做?
    【解决方案2】:

    通过管道将其传送到 Measure-Object cmdlet

    Import-Csv C:\Directory\file.csv | Measure-Object
    

    【讨论】:

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

    一般情况下(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
    

    【讨论】:

    • 最后一个似乎产生了错误:Select-Object : Cannot expand property "count" 因为它没有什么可扩展的。在 line:1 char:64 + Import-Csv C:\Directory\file.csv |测量对象 |选择对象
    • 奇怪,Measure-Object 应该返回一个具有属性 Count 的对象。尝试删除|Select-Object ...,您将看到它返回的内容。
    • 您可能正在使用 PowerShell v1。在 v1 中,当结果为标量(一个对象)时,“Select-Object -expand propertyName”会引发错误。升级到 v2,一切顺利。
    • 谢谢,是的,我使用的是 1.0 版本,这是这个问题的标签之一。
    • 我只检查 PowerShell 标签。并默默假设没有人使用 v1.0。对不起:)
    【解决方案4】:

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

    如果您归档 test.csv 然后获取行数的命令是

    gc test.csv | Measure-Object
    

    【讨论】:

      【解决方案5】:

      你可以试试

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

      $a=Import-Csv C:\Directory\file.csv
      $a.count
      

      【讨论】:

      • 我在一个大文件上使用这种方法得到一个OutOfMemoryException。使用Get-Content | Measure-Object 可以在有限的内存中使用..
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 2017-09-05
        • 2015-08-27
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        相关资源
        最近更新 更多