如何在PowerShell中检测数据集空值?现有统计代码存在遗漏
问题分析与解决方案
首先,咱们先拆解你现有代码里的几个关键问题,这也是你没正确检测到空值的核心原因:
1. 统计逻辑遗漏关键参数
你对 SharesOutstandingUnadjusted 和 NavUnadjustedWithoutDivIncludeFee 只执行了排序操作,没加 -Unique 参数,导致 $SOACount.Count 和 $NUAWDIFCount.Count 返回的是数据集总行数,而非对应列的唯一值数量——这直接让你的判断条件完全失效。
2. 空值检测逻辑偏差
就算补上 -Unique,用「唯一值数量等于12」来判断也不准确:如果某列存在多个空值,Sort-Object -Unique 会把所有空值合并成一个唯一项,此时唯一值数量会变成13(12个有效值+1个空值);但如果某列只有11个有效值+1个空值,唯一值数量刚好是12,你的判断会误判为「数据集正常」,但实际上存在空值。
正确的空值检测与追踪方法
方法一:直接统计每列的空值行数
针对你关心的三个列,分别统计其中空值的数量,能直观知道哪些列存在问题:
# 统计EtpAssetID列的空值数量(字符串类型空值用IsNullOrEmpty判断) $EAIEmptyCount = ($AnalyticsData | Where-Object { [string]::IsNullOrEmpty($_.EtpAssetID) }).Count # 统计SharesOutstandingUnadjusted列的空值数量(数值类型直接判断$null) $SOAEmptyCount = ($AnalyticsData | Where-Object { $_.SharesOutstandingUnadjusted -eq $null }).Count # 统计NavUnadjustedWithoutDivIncludeFee列的空值数量 $NUAWDIFEmptyCount = ($AnalyticsData | Where-Object { $_.NavUnadjustedWithoutDivIncludeFee -eq $null }).Count Write-Host "EtpAssetID 空值数量: $EAIEmptyCount" Write-Host "SharesOutstandingUnadjusted 空值数量: $SOAEmptyCount" Write-Host "NavUnadjustedWithoutDivIncludeFee 空值数量: $NUAWDIFEmptyCount"
方法二:追踪具体的空值行
如果需要定位到底是哪些行存在空值,可以筛选出这些行查看详情:
# 筛选EtpAssetID为空的行并展示 $EAIEmptyRows = $AnalyticsData | Where-Object { [string]::IsNullOrEmpty($_.EtpAssetID) } if ($EAIEmptyRows.Count -gt 0) { Write-Host "发现 EtpAssetID 为空的行:" $EAIEmptyRows | Format-Table -AutoSize } # 同理处理SharesOutstandingUnadjusted列 $SOAEmptyRows = $AnalyticsData | Where-Object { $_.SharesOutstandingUnadjusted -eq $null } if ($SOAEmptyRows.Count -gt 0) { Write-Host "发现 SharesOutstandingUnadjusted 为空的行:" $SOAEmptyRows | Format-Table -AutoSize }
修正后的完整判断逻辑
结合唯一值校验和空值检测,确保数据集既满足唯一值数量要求,又完全没有空值:
# 获取各列的唯一值数量(包含空值) $EAICount = ($AnalyticsData | Sort-Object -Property EtpAssetID -Unique).Count $SOACount = ($AnalyticsData | Sort-Object -Property SharesOutstandingUnadjusted -Unique).Count $NUAWDIFCount = ($AnalyticsData | Sort-Object -Property NavUnadjustedWithoutDivIncludeFee -Unique).Count # 统计各列空值数量 $EAIEmptyCount = ($AnalyticsData | Where-Object { [string]::IsNullOrEmpty($_.EtpAssetID) }).Count $SOAEmptyCount = ($AnalyticsData | Where-Object { $_.SharesOutstandingUnadjusted -eq $null }).Count $NUAWDIFEmptyCount = ($AnalyticsData | Where-Object { $_.NavUnadjustedWithoutDivIncludeFee -eq $null }).Count Write-Host "EtpAssetID 唯一值数量: $EAICount | 空值数量: $EAIEmptyCount" Write-Host "SharesOutstandingUnadjusted 唯一值数量: $SOACount | 空值数量: $SOAEmptyCount" Write-Host "NavUnadjustedWithoutDivIncludeFee 唯一值数量: $NUAWDIFCount | 空值数量: $NUAWDIFEmptyCount" Write-Host "总行数: $($AnalyticsData.Count)" # 判断条件:唯一值数量为12,且空值数量为0 if ($EAICount -eq 12 -and $EAIEmptyCount -eq 0 -and $SOACount -eq 12 -and $SOAEmptyCount -eq 0 -and $NUAWDIFCount -eq 12 -and $NUAWDIFEmptyCount -eq 0) { Write-Host "DataSet is good" } else { Write-Host "DataSet is containing one or more null values." }
内容的提问来源于stack exchange,提问作者Zulfiqar Dholkawala
相关产品推荐
相关产品推荐

