提取字符串的一部分,然后使用它与Powershell中的其他字符串匹配

时间:2017-04-14 14:52:50

标签: powershell

我之前曾要求帮助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_Cleansed333E02MW_Consumption?我觉得我需要的东西可以让我在每个_Manual实例之前提取8位代码,然后用它来查找{MatchingCode}

的任何其他字符串
xxx_xxxx_xxxxxxxxxxx_xxxxxxxxxx_MatchingCode_Cleansed
xxx_xxxx_xxxxxxxxxxx_xxxxxxxxxx_MatchingCode_Consumption

我知道有-like -contains-match运营商,我看过这些帖子使用substringsregex,但我怎么能提取MatchingCode实际上有匹配的东西? This post似乎最接近我的目标,但我不确定如何将其应用于PowerShell。

1 个答案:

答案 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