PowerShell脚本-not与-like文件过滤异常:good_out为空排查
问题排查:PowerShell文件过滤脚本异常分析与修复
需求与异常情况
功能需求
- 读取
game_tiles.csv(游戏标题列表)与negative_phrases.csv(短语列表) - 游戏标题包含短语列表中任意短语 → 写入
test_good.csv - 游戏标题不含任何列表短语 或 包含"Pickels" → 写入
test_bad.csv(含"Pickels"的记录直接归入bad组)
示例预期
The Pickels Game → 含"Pickels" → 写入test_bad.csv The Moon Game → 含短语"Moon" → 写入test_good.csv The Red Unicorn Ultra Game → 含短语"Red Unicorn" → 写入test_good.csv The Red Unicorn Pickles Game → 含"Pickels" → 写入test_bad.csv
异常表现
脚本能过滤含"Pickels"的记录,但所有不含"Pickels"的记录都被写入test_bad.csv,test_good.csv为空。
错误原因分析
原脚本存在3个核心逻辑问题:
- 对象与字符串混淆:
Import-Csv返回的是自定义对象(每行对应一个对象,列是属性),直接用$tagRecord -like $iniRecord比较两个对象永远不会匹配 - 短语匹配缺少通配符:即使取到列值,也需要用通配符包裹短语,才能判断标题包含该短语,而非完全相等
- 含"Pickels"的记录未归入bad组:原脚本仅跳过这类记录,未将其添加到
nonMatchingRecords中
修正后的脚本
注:假设
game_tiles.csv的标题列名为Title,negative_phrases.csv的短语列名为Phrase,请根据实际CSV结构调整列名
# 读取CSV文件(注意:需根据实际列名调整属性名) $gameTitles = Import-Csv "game_tiles.csv" $filterPhrases = Import-Csv "negative_phrases.csv" # 初始化输出数组 $goodRecords = @() $badRecords = @() # 遍历每个游戏标题记录 foreach ($titleRecord in $gameTitles) { # 提取标题字符串(替换为实际CSV中的列名,比如Title) $title = $titleRecord.Title.Trim() # 规则1:含"Pickels"直接归入bad组 if ($title -like "*Pickels*") { $badRecords += $titleRecord continue } $isMatched = $false # 遍历短语列表,检查标题是否包含任意短语 foreach ($phraseRecord in $filterPhrases) { # 提取短语字符串(替换为实际CSV中的列名,比如Phrase) $phrase = $phraseRecord.Phrase.Trim() # 用通配符匹配:标题包含该短语 if ($title -like "*$phrase*") { $goodRecords += $titleRecord $isMatched = $true break } } # 规则2:未匹配到任何短语,归入bad组 if (-not $isMatched) { $badRecords += $titleRecord } } # 写入输出文件 $goodRecords | Export-Csv "test_good.csv" -NoTypeInformation $badRecords | Export-Csv "test_bad.csv" -NoTypeInformation
关键修改点说明
- 明确提取CSV的列值(而非直接操作对象),解决对象比较不匹配的问题
- 短语匹配时用
*$phrase*通配符,实现"标题包含短语"的逻辑 - 新增含"Pickels"记录的处理分支,直接将其加入bad组
- 变量名更具可读性,避免混淆
内容的提问来源于stack exchange,提问作者NanoNet
相关产品推荐
相关产品推荐

