如何检查空/空CSV值?

时间:2015-06-26 19:58:29

标签: powershell

以下代码

"a,b,c
1,1,1
2,,2
3,3,3" > test.csv

import-csv test.csv | select b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_))" 
} 

返回

@{b=1} False
@{b=} False
@{b=3} False

但是,我希望第二行返回True。我尝试了$_ -eq $null -or $_ -eq '',如果它们有效,则没有?

3 个答案:

答案 0 :(得分:2)

问题是% { }$_内部不包含列b的值,而是包含b属性的对象。当您运行[string]::IsNullOrEmpty($_)时,您正在测试此对象是否为null或空字符串,两者都不是真的。

为了说明发生了什么,比较......的结果

Import-Csv .\test.csv | Get-Member

......结果......

Import-Csv .\test.csv | select b | Get-Member

......结果......

Import-Csv .\test.csv | select -ExpandProperty b | Get-Member

一种解决方案是测试b(而不是对象本身)生成的对象的select属性是空还是空:

import-csv test.csv | select b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_.b))" 
}

另一种解决方案是仅将列b的值传递给% { }块:

import-csv test.csv | select -ExpandProperty b | % { 
    Write-Host "$_ $([string]::IsNullOrEmpty($_))" 
}

答案 1 :(得分:0)

我发现以下代码有效。

import-csv test.csv | select b | % { 
    Write-Host "$_ $($_.b -eq '')" 
} 

还有其他解决方案吗?

答案 2 :(得分:0)

在问题的示例中,仍然存在一个带有空b参数的对象。请考虑以下内容,说明您获得结果的原因。

PS C:\Users\matt> @{} -eq $null
False

剩下的就是扩展属性,就像在Bacon's answer

中一样