PowerShell实现CSV文件列数据指定模式匹配筛选
PowerShell筛选指定模式INSTANCE行的正确实现
原有代码问题
- 逻辑运算符使用错误:原代码用
-and要求同一个INSTANCE值同时包含_L_NPRDPRF和_L_NPRDSTD两个互斥的子串,不可能有符合条件的行,因此返回空结果 - 匹配规则覆盖不全:原代码仅写了2种后缀的匹配,没有覆盖要求的4种目标模式,也没有校验前缀、环境位(L/K/M)的规则,容易误筛不符合要求的行
实现方案
方案1:正则一次性匹配(推荐,简洁高效)
直接通过正则表达式完整匹配4种命名规则,自动排除K/M等非L环境位、前缀不符合、后缀不对的实例:
$GetData = Import-Csv -Path "C:\DIAG_2.csv" | Select SYMM_ID,DATE,INSTANCE,'Total Response Time' $Local_Data = $GetData | Where-Object { # 正则规则:SG_SG开头 -> 任意长度业务标识 -> _L_环境位 -> 4种允许的后缀 -> 字符串结尾 $_.INSTANCE -match '^SG_SG_.+_L_(NPRDPRF|NPRDSTD|PRDPRF|PRDSTD)$' }
正则各段作用:
^SG_SG_:强制字符串以SG_SG_开头,过滤前缀不符合的实例.+:匹配规则中xxxxxxxx对应的任意长度业务标识段_L_:强制匹配L环境位,自动排除样例中K、M环境位的无效行(NPRDPRF|NPRDSTD|PRDPRF|PRDSTD)$:匹配4种允许的后缀,$强制后缀为字符串末尾,过滤后缀带多余字符的实例
方案2:通配符多条件匹配(易读性高)
如果不熟悉正则,用PowerShell原生-like通配符加-or逻辑拼接4种模式即可,效果和正则完全一致:
$GetData = Import-Csv -Path "C:\DIAG_2.csv" | Select SYMM_ID,DATE,INSTANCE,'Total Response Time' $Local_Data = $GetData | Where-Object { $_.INSTANCE -like 'SG_SG_*_L_NPRDPRF' -or $_.INSTANCE -like 'SG_SG_*_L_NPRDSTD' -or $_.INSTANCE -like 'SG_SG_*_L_PRDPRF' -or $_.INSTANCE -like 'SG_SG_*_L_PRDSTD' }
两种方案都可以直接运行,筛选后
$Local_Data变量中存储的就是所有符合要求的行,可直接导出为CSV或做后续处理。
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

