掩蔽字段重复

时间:2017-07-10 10:29:02

标签: powershell replace

我正在尝试屏蔽字符串中的字段,如下所示。它在某种程度上正在发挥作用。在$addresspostcode之后的某个阶段,替换字符不会替换正确的位置。有人想知道修复吗?

adressee0行来自输出文件

ADDRESSEE0|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|ZZZZZZZZ|Sir or MadamZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ      |A1|OM|Mr Patrick MurphyZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|45 CregtownZZZZZZZZZZZZZZZZ   |EastRoad RoadZZZZZZZZZZZZZZZZ |TownnamersZZZZZZZZZZZZZZZZ    |CityAB 16ZZZZZZZZZZZZZZZZ     |ZZZZZZZZ|  |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|ZZZZZZZZZZZZZZZZ    |Sir or MadamZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ      |IA|3319041|       |       |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZZZZZZZZ
ForEach-Object { 
  $addresseeName = $_.Substring(11,50)
  $addresseeName2 = $_.Substring(62,50)
  $addresseeLine1 = $_.Substring(113,30)
  $addresseeLine2 = $_.Substring(144,30)
  $addresseeLine3 = $_.Substring(175,30)
  $addresseeLine4 = $_.Substring(206,30)
  $addresseePostCode = $_.Substring(237,8)
  $referenceAddressName1 = $_.Substring(303,50)
  $referenceAddressName2 = $_.Substring(354,50)
  $referenceAddresseeLine1 = $_.Substring(405,30)
  $referenceAddresseeLine2 = $_.Substring(436,30)
  $referenceAddresseeLine3 = $_.Substring(467,30)
  $referenceAddresseeLine4 = $_.Substring(498,30)

  $mask50 = 'X' * 50
  $mask30 = 'Y' * 30
  $mask08 = 'Z' * 8

  # IF statement, if the string is at position 0-10, and begins with 'ADDRESSEE0'
  # then run replace statement
  if ($_.Substring(0,10) -eq 'ADDRESSEE0') {
    $_.Replace($addresseeName, $mask50).Replace($addresseeName2, $mask50).Replace($addresseeLine1, $mask30).Replace($addresseeLine2, $mask30).Replace($addresseeLine3, $mask30).Replace($addresseeLine4, $mask30).Replace($addresseePostCode, $mask08).Replace($referenceAddressName1, $mask50).Replace($referenceAddressName2, $mask50).Replace($referenceAddresseeLine1, $mask30).Replace($referenceAddresseeLine2, $mask30).Replace($referenceAddresseeLine3, $mask30).Replace($referenceAddresseeLine4, $mask30)

2 个答案:

答案 0 :(得分:3)

假设ADDRESSEE0|...是输入字符串,为什么不首先拆分数据?这提供了可管理的块,而不是一个巨大的字符串与卡车方法链。像这样,

# Get input data
$raw = `'ADDRESSEE0|ADDRESSEE1|ADDRESSEELine0|ADDRESSEELine1|...'` 

# Split the string by each pipe | char. This uses regex syntax, so escape \ is needed
$lines = $raw -split '\|'

# Assign splitted elements into more readable variables
$addresseeName  = $lines[0]
$addresseeName2 = $lines[1]
$addresseeLine1 = $lines[2]
...

# mask the data whatever way floats your boat
$addresseeName = $addresseeName.substring(0,9) + $mask08 

答案 1 :(得分:3)

代码的问题在于它根据字符串的内容(而不是位置)进行替换。这意味着如果字符串中的其他位置存在相同的文本,它也会替换该文本,从而破坏以后的替换。

我建议你这样做:

$mask50 = 'X' * 50
$mask30 = 'Y' * 30
$mask08 = 'Z' * 8

$SomeInput | ForEach-Object { 

    if ($_.Substring(0,10) -eq 'ADDRESSEE0')
    {
        $SplitString = $_.Split('|')
        1..2 | ForEach-Object { $SplitString[$_] = $mask50 }
        3..6 | ForEach-Object { $SplitString[$_] = $mask30 }
        $SplitString[7] = $mask08
        8..9 | ForEach-Object { $SplitString[$_] = $mask50 }
        10..13 | ForEach-Object { $SplitString[$_] = $mask30 }

        $SplitString -Join '|'
    }
}

这会根据|字符拆分字符串,然后对每个字符进行单独替换(我们使用..数组表示法使其效率更高一些)。

然后我们再次使用|字符加入字符串。