我想得到一个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"
型
我如何才能做到这一点?
1条答案
按热度按时间vc9ivgsu1#
若要从对象/集合中的每个对象中选择 * 属性子集**,请将其通过管道传输到**
Select-Object
,并将感兴趣的属性名称传递给-Property
参数**。因此,要仅获取
Count
属性(使用简化示例):字符串
注意事项:
Select-Object
输出一个包含指定属性的[pscustomobject]
示例。Export-Csv
,将获得所需的CSV输出;要在内存中验证此 *,请改为通过管道连接到ConvertTo-Csv
。Count
属性的 * 值 *(而不是具有Count
属性的 * 对象 *),则可以使用-ExpandProperty
而不是-Property
,或者使用管道连接到| ForEach-Object Count
;但下面的方法更简洁有效:[2]型
至于你你在数什么:
Get-Content
而不是Import-Csv
使用 * 纯文本 * 处理*型
*注意事项:
Import-Csv
就是你所需要的 * 全部 *:不需要Select-Object -Skip 1
,因为Import-Object
返回的是只表示 data 行的对象-标题信息以对象的 * 属性名称 * 的形式“烘焙”到每个这样的对象中:型
*注:
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-Object
或ForEach-Object
技术。