PowerShell导入CSV后过滤空值/长度为0的行失败问题排查
问题分析与修正
你的命令逻辑存在两处核心错误,导致无法过滤掉含空值的行:
错误点1:取错了Length的目标
原命令里的$_.PSObject.Properties | ForEach-Object {$_.length},取的是属性对象(PropertyInfo类型)自身的Length属性,而不是属性对应的值的长度。你要检查的是单元格内容的长度,应该取属性的Value属性,也就是$_.Value.Length。
错误点2:过滤逻辑完全颠倒
原命令的(... -eq 0)会返回一个布尔数组(每个属性对应一个判断结果),PowerShell中Where-Object会把非空的布尔数组视为$true,这就导致你最终留下的是至少有一个空值/长度为0的行,和你想要的“过滤掉这类行”的需求完全相反。
修正后的命令
如果你要过滤掉**任意一个属性值为$null或空字符串(长度为0)**的行,也就是只保留所有属性都有有效内容的行,可以用下面两种写法:
写法1:管道式判断
$csv = Import-Csv $path | Where-Object { # 检查当前行是否不存在任何空值/空字符串 -not ($_.PSObject.Properties.Value | Where-Object { $_ -eq $null -or ($_ -is [string] -and $_.Length -eq 0) }) }
写法2:循环判断(更直观)
$csv = Import-Csv $path | Where-Object { foreach ($prop in $_.PSObject.Properties) { $val = $prop.Value # 一旦发现空值或空字符串,标记该行需要过滤 if ($val -eq $null -or ($val -is [string] -and $val.Length -eq 0)) { return $false } } # 所有属性都有效,保留该行 return $true }
关于你测试的补充
你测试($t.'Today Maximum Drawdown').length得到0,说明这个属性的值是空字符串,但原命令没检测到,就是因为你没取属性的Value,而是取了属性对象本身的Length,完全没触达实际的单元格内容。
内容的提问来源于stack exchange,提问作者iceman
相关产品推荐
相关产品推荐

