当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell - 获取 CSV 文件中的行数 [3 种方法]

作者:精品下载站 日期:2024-12-14 05:26:08 浏览:15 分类:玩电脑

PowerShell - 获取 CSV 文件中的行数 [3 种方法]


使用 Get-Content Cmdlet

可以通过以下方式使用 Get-Content cmdlet 来获取指定 .csv 文件中的行数:

  • 具有 .Length 属性的 Get-Content cmdlet
  • 具有 .Count 属性的 Get-Content cmdlet
  • 具有 .ReadCount 属性的 Get-Content cmdlet
  • 带有 Measure-Object cmdlet 及其 -Line 参数的 Get-Content cmdlet

在采用上述方法之前,让我们先看一下 countries.csv 的内容;您可以使用您的 .csv 文件。虽然这里的内容是可选的,但它有助于了解我们拥有的行数。

countries.csv 文件内容:

Country Capital India Delhi China Beijing Bhutan Thimphu Nepal Kathmandu France Paris

将 Get-Content 与 .Length 属性结合使用:

(Get-Content .\countries.csv).Length

输出 :

6

Get-Content 用于检索指定文件的内容,在我们的例子中为 countries.csv。我们使用 . 表示法,因为 countries.csv 位于当前目录中,但我们可以将路径传递为 E:\Test\countries.csv 如果 .csv 文件位于不同的目录中。

通过此方法,我们使用 Get-Contentcountries.csv 的内容(包括标题)读取到数组中,然后访问 .Length该数组的属性来获取 countries.csv 文件中的行数。当我们想要获取完整.csv文件的行数时,首选此方法;但是,它可能会消耗大量内存,并且对于较大的文件来说速度会很慢,因为它将整个 CSV 文件加载到内存中。

Get-Content.Count 属性结合使用可获取 PowerShell 中指定 CSV 文件的行数。

将 Get-Content 与 .Count 属性结合使用:

(Get-Content .\countries.csv).Count

输出 :

6

此代码与前面的示例类似,统计了 countries.csv 文件的标头,但我们使用了 .Count 属性来获取 中的总行数>countries.csv。与之前的方法类似,它也会将整个文件加载到内存中;对于大文件来说,它可能会很慢并且消耗大量内存。请记住,.Count.Length 是相同的属性并给出相同的结果。

Get-ContentMeasure-Object cmdlet 及其 -Line 参数结合使用来获取 CSV 文件中的行数。

将 Get-Content 与 Measure-Object -Line 结合使用:

(Get-Content .\countries.csv) | Measure-Object -Line

输出 :

Lines 
-----
6

这是在 PowerShell 中获取 CSV 文件行数的另一种方法。在此方法中,我们使用管道 (|) 将 Get-Content cmdlet 读取的内容转发到 Measure-Object。在这里,我们将 -Line 参数与 Measure-Object 一起使用,它告诉我们计算接收到的输入中的行数。

现在,什么是测量对象?此 cmdlet 计算对象特定类型的属性值,它根据命令中给定的参数执行。例如,我们使用 -Line 参数来获取行数,但 -Word-Character-Property 用于分别检索单词、字符和属性名称。

我们可以使用 Measure-Object 来对对象或具有我们将在命令中指定的特定属性的对象进行计数。例如,如果您使用数值,我们还可以使用此 cmdlet 来计算总和、最小值/最大值、标准差和平均值。

注意: Get-Content cmdlet 具有 .Length.Count 属性以及 Measure-Object -如果 CSV 文件末尾有空行,Line 将无法正常工作。

使用 Get-Content.ReadCount 属性来获取给定 CSV 文件中的行数。

将 Get-Content 与 .ReadCount 属性结合使用:

$count = (Get-Content .\countries.csv).ReadCount
Write-Host "The number of lines that are read: " $count

输出 :

The number of lines that are read:  1 2 3 4 5 6

此方法在计算行数时还包括 CSV 文件的标题。当我们想知道已读取的行号时,使用 .ReadCount 非常有用;此处,最后一个数字将显示 countries.csv 文件中的总行数。

上面的脚本使用 Get-Content cmdlet 将 countries.csv 的内容读取到对象中,然后访问的 .ReadCount 属性获取行数的对象。

.ReadCount 属性返回从文件中读取的行数。处理大文件时,此方法比以前的方法更快,因为它不会将整个文件加载到内存中。

此外,此方法不存在计算 countries.csv 末尾的空白行(如果有)的问题,因为它仅返回已从文件中读取的行数。

使用 Import-Csv Cmdlet

可以通过以下方式使用 Import-Csv cmdlet 来获取指定 .csv 文件中的行数:

  • 带有 Measure-Object cmdlet 的 Import-Csv cmdlet
  • 带有 Measure ObjectSelect-Object cmdlet 的 Import-Csv cmdlet
  • 具有 .Count 属性的 Import-Csv cmdlet

使用 Import-Csv 很有帮助,因为它会计算 CSV 文件中不包括标题的行数。下面我们就来一一学习一下。

结合使用 Import-Csv cmdlet 和 Measure-Object cmdlet 来获取 PowerShell 中 CSV 文件的行数。

将 Import-Csv 与 Measure-Object Cmdlet 结合使用:

Import-Csv .\countries.csv | Measure-Object

输出 :

Count: 5

在这里,我们使用了 Import-Csv,它将 countries.csv 文件转换为对象数组,并使用 Measure-Object 对其进行管道传输(我们在上一节中已经学习过),它将显示不包括标题的行数。如果我们只想得到一个计数,我们可以使用以下解决方案。

Import-Csv cmdlet 与 Measure ObjectSelect-Object cmdlet 结合使用,在 PowerShell 中获取 CSV 文件中的行数.

将 Import-Csv 与测量对象和选择对象结合使用:

Import-Csv .\countries.csv | Measure-Object | Select-Object -Expand Count

输出 :

5

它与前面的命令类似,产生相同的结果。尽管如此,我们还是使用了 Select-Object cmdlet 和 - Expand 参数,允许我们扩展由 Measure-Object 返回的对象属性,并且返回 Count 属性的值,如上面的输出所示。

使用 Import-Csv cmdlet 和 .Count 属性获取 PowerShell 中 CSV 文件的行数。

将 Import-Csv 与 .Count 属性结合使用:

(Import-Csv .\countries.csv).Count

输出 :

5

上面的命令执行相同的操作,显示指定 CSV 文件中的行数,但我们使用 .Count 属性来获取该计数。

注意:使用 Import-Csv cmdlet 的上述所有方法都会将整个文件加载到内存中,因此对于大文件来说可能会很慢并消耗大量内存。此外,如果 CSV 文件末尾有空行,它将无法正常工作。

到目前为止,我们已经了解了获取 CSV 文件中的记录数的各种方法,但是如果项目需求发生了一些变化,需要统计当前目录和子目录中多个 CSV 文件的行数怎么办?让我们看看下面的部分。

Get-ChildItemForeach-Object 结合使用

Get-ChildItemForeach-Object 结合使用可从 PowerShell 中的当前目录和子目录获取多个 CSV 文件中的行数。

将 Get-ChildItem 与 Foreach-Object 结合使用:

Get-ChildItem "." -re -in "*.csv" | 
Foreach-Object { 
    $fileStats = Get-Content $_.FullName | Measure-Object -line
    $linesInFile = $fileStats.Lines -1
    Write-Host "$_,$linesInFile" 
}

输出 :

E:\Test\countries.csv,5

上面的脚本使用 Get-ChildItem cmdlet 获取当前目录及其子目录中的所有 CSV 文件,由 -Recurse 参数指定(别名为 - re)和 -Include 参数(别名为 -in)用于仅包含扩展名为 .csv 的文件。然后使用 Foreach-Object cmdlet 迭代集合中的每个文件。

对于每个文件,使用 Get-Content cmdlet 读取文件的内容,并使用 -Line 将它们通过管道传输到 Measure-Object cmdlet范围。 -Line 参数告诉 Measure-Object 计算输入中的行数。

Measure-Object 的输出存储在变量 $fileStats 中,减去 $linesInFile 后的行数存储在变量 $linesInFile 中code>1 排除标题行。

最后,使用Write-Host cmdlet 将当前文件名和行数写入主机。当您想知道目录及其子目录中所有 CSV 文件的行数时,它非常有用。例如,我们只能使用以下命令来获取计数。

将 Get-ChildItem 与 Foreach-Object 结合使用:

Get-ChildItem . -Filter “*.csv” -Name |
ForEach-Object{
   (Get-Content $_).Length - 1
}

输出 :

5

该命令与前一个命令类似,但有以下三点不同:我们使用 -Filter 参数仅包含以 .csv 扩展名结尾的文件,-Name 参数仅返回文件的名称文件而不是完整路径,而 .Length 用于获取行数。

这就是如何在 PowerShell 中获取 CSV 文件的行数。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯