我之前曾要求帮助parsing a text file,并且已将此代码用于我的脚本:
import-csv $File -header Tag,Date,Value|
Where {$_.Tag -notmatch '(_His_|_Manual$)'}|
Select-Object *,@{Name='Building';Expression={"{0} {1}" -f $($_.Tag -split '_')[1..2]}}|
Format-table -Groupby Building -Property Tag,Date,Value
我从那时起就意识到,虽然代码会过滤掉包含_His
或_Manual
的所有代码,但我还需要过滤与_Manual
相关联的所有代码。例如,我的文本文件中包含以下标记:
L01_B111_BuildingName1_MainElectric_111A01ME_ALC,13-Apr-17 08:45,64075 L01_B111_BuildingName1_MainElectric_111A01ME_Cleansed,13-Apr-17 08:45,64075 L01_B111_BuildingName1_MainElectric_111A01ME_Consumption,13-Apr-17 08:45,10.4 L01_B333_BuildingName3_MainWater_333E02MW_Manual,1-Dec-16 18:00:00,4.380384E+07 L01_B333_BuildingName3_MainWater_333E02MW_Cleansed,1-Dec-16 18:00:00,4.380384E+07 L01_B333_BuildingName3_MainWater_333E02MW_Consumption,1-Dec-16 18:00:00,25.36
333E02MW_Manual
字符串将使用我当前的代码排除,但我怎样才能排除333E02MW_Cleansed
和333E02MW_Consumption
?我觉得我需要的东西可以让我在每个_Manual
实例之前提取8位代码,然后用它来查找{MatchingCode}
xxx_xxxx_xxxxxxxxxxx_xxxxxxxxxx_MatchingCode_Cleansed
xxx_xxxx_xxxxxxxxxxx_xxxxxxxxxx_MatchingCode_Consumption
我知道有-like
-contains
和-match
运营商,我看过这些帖子使用substrings和regex,但我怎么能提取MatchingCode实际上有匹配的东西? This post似乎最接近我的目标,但我不确定如何将其应用于PowerShell。
答案 0 :(得分:1)
您可以找到以_Manual
结尾的每个标记,并创建与_Manual
之前的任何部分匹配的正则表达式模式。实施例
$Data = Import-Csv -Path $File -Header Tag,Date,Value
#Create regex that matches any prefixes that has a manual row (matches using the value before _Manual)
$ExcludeManualPattern = ($Data | Foreach-Object { if($_.Tag -match '^(.*?)_Manual$') { [regex]::Escape($Matches[1]) } }) -join '|'
$Data | Where-Object { $_.Tag -notmatch '_His_' -and $_.Tag -notmatch $ExcludeManualPattern } |
Select-Object -Property *,@{Name='Building';Expression={"{0} {1}" -f $($_.Tag -split '_')[1..2]}}|
Format-table -GroupBy Building -Property Tag,Date,Value