通过键/值矩阵重命名字符串

问题描述 投票:0回答:1

我正在尝试重命名从用户定义字段中提取的字符串。因此,我设置了一个矩阵,用于在来自 UDF 的内容与我希望将该字符串重命名为的内容之间建立关系。

这是我的矩阵 (CSV) 的伪示例:

Key,Value
FooBar1234,Test 1
ASDF[1234]=qwerty,Test 2
Yellow,Test 3
YellowString,Test 3
1234567890,Test 1
Foo,Test 1
Jane Smith,Test 4
Jane,Test 4
Jane(ABC),Test 4

这是我的脚本获取的数据示例 (CSV):

FooBar1234
ASDF[1234]=qwerty
Yellow
YellowString
1234567890
Foo
Jane Smith
Jane
Jane(ABC)
Jane(abc)

这是我的 PowerShell 脚本:

$path = 'Path\To\CSV\file.csv'

$data = Import-Csv $path -Header UDFName

$matrix = @{}
#import matrix
$re = Import-Csv 'Path\To\Matrix\file.csv' | ForEach-Object{
    #key equals value
    $matrix[$_.Key] = $_.Value
    [regex]::Escape($_.Key)
}
$re = $re -join '|' -as [regex]


$data | ForEach-Object {

    $udf_rename = $re.Replace($_.UDFName,  { $matrix[$args[0].Value] })

    $_.UDFName = $udf_rename

    $_

}| ConvertTo-Csv | Select-Object -Skip 2 | Set-Content $path

这是完整的输出:

"Test 1"
"Test 2"
"Test 3"
"Test 3String"
"Test 1"
"Test 1"
"Test 4"
"Test 4"
"Test 4(ABC)"
"Test 4(abc)"

我遇到的问题(除了它是用户定义字段😓这一事实之外)是,当我尝试用值替换键时,我的代码仅替换某些输入的部分输入字符串。例如,如果

YellowString
通过循环,我预计会看到
Test 3
作为结果。然而,因为
Yellow,Test 3
是矩阵的一部分,所以我最终得到
Test 3String
作为结果。由于矩阵中
Yellow
YellowString
之间建立的关系,我的循环仅替换
Yellow
Test 3
部分。
Jane
Jane(ABC)
也会发生类似的情况。

不幸的是,我无法从矩阵中删除

Yellow,Test 3
和其他变体,所以我需要弄清楚如何精确匹配输入字符串。我尝试从键中删除所有空格,但它仍然产生相同的结果。我还认为也许我可以将唯一的代码附加到每个键上,然后以这种方式进行翻译,但是当涉及到替换时我遇到了同样的问题。有任何想法吗?如果我可以提供更多信息,请告诉我。

regex powershell csv matrix key
1个回答
0
投票

PowerShell 的正则表达式功能和 .NET 的正则表达式 API 默认在 substrings 上运行。 为了确保每个输入字符串都完全匹配,请使用

^...$
:

锚定每个正则表达式
'^{0}$' -f [regex]::Escape($_.Key)
© www.soinside.com 2019 - 2024. All rights reserved.