如何仅当Site值存在于主文件时,向PowerShell变量追加内容?
实现方案:仅保留存在于Site_Master.csv中的Site数据
完全可行,核心思路是先把主文件里的合法Site值提前提取出来作为筛选依据,再处理目标CSV文件:
- 第一步:导入Site_Master.csv,提取所有Site值存到一个快速查找的集合里(用哈希表比数组查找效率更高)
- 第二步:遍历目标目录下的CSV文件,导入数据后先筛选出Site在合法集合中的记录,再去重,最后追加到$EntitySiteList
示例代码
# 初始化结果变量 $EntitySiteList = @() # 导入主文件,提取合法Site值存入哈希表(键为Site,值为$true,方便快速判断) $validSites = @{} Import-Csv -Path "Site_Master.csv" | ForEach-Object { $validSites[$_.Site] = $true } # 遍历目标目录下的CSV文件(替换成你的实际目录路径) Get-ChildItem -Path "你的目标目录路径" -Filter "*.csv" -Recurse | ForEach-Object { # 导入CSV,指定表头并跳过首行(根据原代码逻辑调整,确保和原有导入方式一致) $csvData = Import-Csv -Path $_.FullName -Header "Entity", "Site" | Select-Object -Skip 1 # 筛选Site在合法集合中的记录,然后去重 $filteredData = $csvData | Where-Object { $validSites.ContainsKey($_.Site) } | Select-Object Entity, Site -Unique # 追加到结果变量 if ($filteredData) { $EntitySiteList += $filteredData } } # 可选:查看最终结果 $EntitySiteList
注意事项
- 确保Site_Master.csv里的Site列名称和目标CSV里的Site列名称完全一致(PowerShell默认区分大小写)
- 如果需要忽略大小写匹配,可以把判断逻辑改成
$validSites.ContainsKey($_.Site.ToLower()),同时导入主文件时也转成小写:$validSites[$_.Site.ToLower()] = $true - 若原代码用其他方式跳过首行(比如
Get-Content | Select-Object -Skip 1 | ConvertFrom-Csv),只需对应调整导入部分代码,核心筛选逻辑不变
内容的提问来源于stack exchange,提问作者chrtak
相关产品推荐
相关产品推荐

