当文件中只有一行时,Powershell对文件中的行计数不正确?
我正在编写一个powershell脚本来计算包含100000多行的csv文件的摘要统计信息 在我的foreach循环中,我的一行是:当文件中只有一行时,Powershell对文件中的行计数不正确?,powershell,count,Powershell,Count,我正在编写一个powershell脚本来计算包含100000多行的csv文件的摘要统计信息 在我的foreach循环中,我的一行是: $count = $Not_10000.count 其中“$Not_10000”是过滤csv后的结果,该csv是使用导入csv命令读取并使用 where {$_.ifhighspeed -eq 10000}. 我发现只要“$Not_10000”有多行,“$count”的值就是正确的。但是,当“$Not_10000”只有一行时,结果是$count为空。我尝试进入
$count = $Not_10000.count
其中“$Not_10000”是过滤csv后的结果,该csv是使用导入csv命令读取并使用
where {$_.ifhighspeed -eq 10000}.
我发现只要“$Not_10000”有多行,“$count”的值就是正确的。但是,当“$Not_10000”只有一行时,结果是$count为空。我尝试进入powershell提示符并执行以下操作
$count = $Not_10000 | Measure-Object -lines
但它显示0行,即使只有一行。产量
$Not_10000[0]
是
为什么这一行输出不能正确计数?我手动更改了过滤器,使“$Not_10000”包含15行,这是正确的计数
我似乎很难给出完整的图片,因此如果您需要更多信息或说明,请告诉我。使用
测量对象的Count属性。线条、文字、字符是用来测量文本的东西,而不是对象
$count = $Not_10000 | Measure-Object | Select-Object -ExpandProperty Count
或
更多解释
我有一个带有标题和7个条目的csv
Path Data Files
---- ---- -----
\\someserver\somepath1 100 1
\\someserver\somepath2 150 4
\\someserver\somepath1 200 5
\\someserver\somepath3 450 8
\\someserver\somepath4 200 23
\\someserver\somepath1 350 2
\\someserver\somepath2 800 9
执行以下操作时(-行
不是测量对象
的有效开关)
因为这不是文本,所以没有要测量的线。无论文件或过滤对象中有多少条目,我都会获得此输出。你会期望得到3,但实际上得到了0
Lines Words Characters Property
----- ----- ---------- --------
0
如果我把文件读成文本,我会得到行的结果
Get-Content E:\temp\stack.csv | Measure-Object -line
Lines
-----
8
使用测量对象的计数属性
。线条、文字、字符是用来测量文本的东西,而不是对象
$count = $Not_10000 | Measure-Object | Select-Object -ExpandProperty Count
或
更多解释
我有一个带有标题和7个条目的csv
Path Data Files
---- ---- -----
\\someserver\somepath1 100 1
\\someserver\somepath2 150 4
\\someserver\somepath1 200 5
\\someserver\somepath3 450 8
\\someserver\somepath4 200 23
\\someserver\somepath1 350 2
\\someserver\somepath2 800 9
执行以下操作时(-行
不是测量对象
的有效开关)
因为这不是文本,所以没有要测量的线。无论文件或过滤对象中有多少条目,我都会获得此输出。你会期望得到3,但实际上得到了0
Lines Words Characters Property
----- ----- ---------- --------
0
如果我把文件读成文本,我会得到行的结果
Get-Content E:\temp\stack.csv | Measure-Object -line
Lines
-----
8
马特给出了一个很好的答案,但这只是对你们问题的一种回答
.Count
属性是当结果数超过一个时引用的数组对象类型的成员。当您只有一个结果时,返回的不是数组、字符串、对象、整数或其他内容,而是数组,除非您专门将其设置为数组。为了使其始终返回一个数字:
$count = $Not_10000.count
您需要将其强制转换为数组,最简单的方法是将其封装在@()
在数组上使用时,使用任何对象的.PSObject成员最容易看到这一点。让我们创建一个数组,查看类型以验证它是否为数组,然后查看该数组对象的PSObject成员(仅筛选属性,因为它有许多我们不关心的成员)
PS C:\Users> $test = @("Red","Blue","Green")
PS C:\Users> $test.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\Users> $test.PSObject.Members | Where{$_.MemberType -match "property"}|FT Name,MemberType,Value,ReferencedMemberName
Name MemberType Value ReferencedMemberName
---- ---------- ----- --------------------
Count AliasProperty 3 Length
Length Property 3
LongLength Property 3
Rank Property 1
SyncRoot Property {Red, Blue, Green}
IsReadOnly Property False
IsFixedSize Property True
IsSynchronized Property False
Item ParameterizedProperty ...int index) {get;set;}
我们在这里看到的是,它是成员长度的alias属性,数组中的alias属性提供记录数,就像它的alias Count一样。Matt给出了一个很好的答案,但这只是对您的问题的一种回答
.Count
属性是当结果数超过一个时引用的数组对象类型的成员。当您只有一个结果时,返回的不是数组、字符串、对象、整数或其他内容,而是数组,除非您专门将其设置为数组。为了使其始终返回一个数字:
$count = $Not_10000.count
您需要将其强制转换为数组,最简单的方法是将其封装在@()
在数组上使用时,使用任何对象的.PSObject成员最容易看到这一点。让我们创建一个数组,查看类型以验证它是否为数组,然后查看该数组对象的PSObject成员(仅筛选属性,因为它有许多我们不关心的成员)
PS C:\Users> $test = @("Red","Blue","Green")
PS C:\Users> $test.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\Users> $test.PSObject.Members | Where{$_.MemberType -match "property"}|FT Name,MemberType,Value,ReferencedMemberName
Name MemberType Value ReferencedMemberName
---- ---------- ----- --------------------
Count AliasProperty 3 Length
Length Property 3
LongLength Property 3
Rank Property 1
SyncRoot Property {Red, Blue, Green}
IsReadOnly Property False
IsFixedSize Property True
IsSynchronized Property False
Item ParameterizedProperty ...int index) {get;set;}
我们在这里看到的是,它是成员长度的alias属性,数组上的alias属性提供记录数,就像它的alias Count一样。虽然我可以复制它,但每当我在对象上使用-line
时,我都会得到0
<代码>-行
更多用于文本<代码>单独测量对象并捕获计数属性$count=($Not_10000 |测量对象)。count
谢谢($Not_10000 |测量对象)。Count
按我的需要工作。不确定为什么$Not_1000。尽管count
不起作用。count是度量对象的属性,而不是Csv对象。查看我的答案,如果它有助于标记它。虽然我可以复制此答案,但每当我在对象上使用-line
时,我都会得到0
<代码>-行
更多用于文本<代码>单独测量对象并捕获计数属性$count=($Not_10000 |测量对象)。count
谢谢($Not_10000 |测量对象)。Count
按我的需要工作。不确定为什么$Not_1000。尽管count
不起作用。count是度量对象的属性,而不是Csv对象。看看我的答案,如果它有助于标记它本身。+1很好地补充了我的答案。看起来我确实忽略了这个事实。+1很好地补充了我的答案。看起来我对那个事实漠不关心。