csv 如何仅获取Measure-Object PowerShell的一列输出

dbf7pr2w  于 2023-07-31  发布在  Shell
关注(0)|答案(1)|浏览(101)

我想得到一个csv文件的行数。我运行了以下代码来获取它:

$csvPath = "some.csv"
$lineCount = "linecount.csv"
Import-Csv $csvPath | Select-Object -Skip 1 | Measure-Object | Export-CSV $lineCount -NoTypeInformation

字符串
这是我在linecount.csv中得到的输出:

"Count","Average","Sum","Maximum","Minimum","Property"
"100",,,,,


这是我想要的输出:

"Count"
"100"


我如何才能做到这一点?

vc9ivgsu

vc9ivgsu1#

若要从对象/集合中的每个对象中选择 * 属性子集**,请将其通过管道传输到**Select-Object,并将感兴趣的属性名称传递给-Property参数**。
因此,要仅获取Count属性(使用简化示例):

# To pass *multiple* property names, separate them with ","
# Since -Property is the first positional parameter, you may omit its name.
1..10 | Measure-Object | Select-Object -Property Count

字符串
注意事项:

  • 对于每个输入对象,Select-Object输出一个包含指定属性的[pscustomobject]示例。
  • 除了按原样选择现有属性,您还可以定义calculated properties,它可以用于定义从输入对象的属性值 * 派生 * 的值的属性,* 重命名 * 属性,或添加全新的属性。
  • 如果将上述内容通过管道传输到Export-Csv,将获得所需的CSV输出;要在内存中验证此 *,请改为通过管道连接到ConvertTo-Csv
  • 相比之下,如果您只需要Count属性的 * 值 *(而不是具有Count属性的 * 对象 *),则可以使用-ExpandProperty而不是-Property,或者使用管道连接到| ForEach-Object Count;但下面的方法更简洁有效:[2]
(1..10 | Measure-Object).Count   # -> 10


至于你你在数什么

  • 如果要确定输入CSV文件中的**数据 * 行数 (不包括标题行),请通过Get-Content而不是Import-Csv使用 * 纯文本 * 处理*
Get-Content $csvPath | Select-Object -Skip 1 | Measure-Object | 
  Select-Object Count | Export-CSV $lineCount -NoTypeInformation

*注意事项:

  • CSV rows 可以跨越超过 line,所以这个方法只会在所有行,包括标题行,每一行都正好占用一行的情况下报告正确的计数(虽然这是 * 典型的 *,但它不是 * 保证的 *)。
  • 正如圣地亚哥所指出的,这种方法在处理大型输入文件时性能很差,在这种情况下,最好使用this answer中所示的方法。
  • 如果你想要**输入CSV文件中的数据行数 *,Import-Csv就是你所需要的 * 全部 *:不需要Select-Object -Skip 1,因为Import-Object返回的是只表示 data 行的对象-标题信息以对象的 * 属性名称 * 的形式“烘焙”到每个这样的对象中:
Import-Csv $csvPath | Measure-Object | 
  Select-Object Count | Export-CSV $lineCount -NoTypeInformation

*注:

  • 虽然这是计算CSV文件中数据行的正确且可靠的方法,但它甚至比Get-Content方法更慢。

[1]为了反映从中获取属性的对象的类型,通过PowerShell的ETS (Extended Type System)为输出对象分配了一个附加的类型名称,该名称通过将Selected.前置到输入对象的完整类型名称来形成。在本示例中:Selected.Microsoft.PowerShell.Commands.GenericMeasureInfo .例如,当您将此类示例传递给Get-Member时,此ETS类型名称就会出现,并且也会作为内部.pstypenames属性值的第一个条目以及Export-Csv/ConvertTo-Csv添加到CSV输出的类型标识注解中(如果-NoTypeInformation * not* used in Windows PowerShell /如果-IncludeTypeInformation * used in PowerShell (Core) 7+)。
[2]这甚至适用于 * 多个 * 输入对象,这得益于PowerShell的member-access enumeration功能。但是,这需要预先收集内存中的所有输入对象。虽然这通常不会成为问题,但对于必须逐个处理属性值的大型输入集合,可能会出现问题;在这种情况下,使用Select-ObjectForEach-Object技术。

相关问题