我正在尝试重命名从用户定义字段中提取的字符串。因此,我设置了一个矩阵,用于在来自 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
和其他变体,所以我需要弄清楚如何精确匹配输入字符串。我尝试从键中删除所有空格,但它仍然产生相同的结果。我还认为也许我可以将唯一的代码附加到每个键上,然后以这种方式进行翻译,但是当涉及到替换时我遇到了同样的问题。有任何想法吗?如果我可以提供更多信息,请告诉我。
PowerShell 的正则表达式功能和 .NET 的正则表达式 API 默认在 substrings 上运行。 为了确保每个输入字符串都完全匹配,请使用
^...$
: 锚定每个正则表达式
'^{0}$' -f [regex]::Escape($_.Key)