【问题标题】:Powershell - use CSV as a lookup for replace operationPowershell - 使用 CSV 作为替换操作的查找
【发布时间】:2016-07-20 18:53:42
【问题描述】:

我有一个现有的脚本,它读取源文件并用新字符替换某些字符。所以它几乎是硬编码的。

(Get-Content $path\$xml_out) | Foreach-Object {$_ -replace '<ContactCode>PROP</ContactCode>','<ContactCode>OFFICE</ContactCode>'}  | set-content $path\$xml_out

我想做的是将旧值和新值存储在 CSV 文件中(只有 2 列),以便用户可以进行临时更改。所以我的 CSV 看起来像这样

ORGIGINAL_CODE,NEW_CODE
CAREHOME,OFFICE
PROP,EMERG
MAIN,OFFICE
DAY,OFFICE
TELE,TEL
BUSINESS,OFFICE

这是我要替换的原始文件。

CAREHOME
PROP
MAIN
DAY
TELE
BUSINESS

我正在使用 import-csv,但尝试使用 ForEach 循环,其中包含 Get-Content。

$testcsv = import-csv $path\mapping.csv
ForEach ($row in $testcsv)
{
    $field1 = $row.ORGIGINAL_CODE
    $field2 = $row.NEW_CODE
    Echo "$field1 maps to $field2"
    echo "$xml_out"
    (Get-Content $path\$xml_out) | Foreach-Object  {$_ -replace '$field1','$field2'}  | set-content $path\$xml_out
}

因此,与其在源文件中将 field1 替换为 field2,不如将我的代码放入其中

$_ -replace $field1,$field2
$_ -replace $field1,$field2
$_ -replace $field1,$field2
$_ -replace $field1,$field2
$_ -replace $field1,$field2
$_ -replace $field1,$field2
$_ -replace $field1,$field2

我希望最终得到

OFFICE
EMERG
OFFICE
OFFICE
TEL
OFFICE

我怀疑我没有正确地转义它。

【问题讨论】:

  • 请逐字向我们提供您提到的“投诉”。另外,请提供minimal reproducible example,因为上面的 sn-p 中的许多变量是不可见的($CSV$path 等)。
  • 我注意到在您的原始编辑中,您在 ForEach 循环中嵌套了一个脚本块,这将提供您看到的输出。 Foreach-Object { {$_ -replace '$field1','$field2'} }。这是我对您的问题原因的猜测 - 它只是将脚本块写入带有 Set-Content 的文件。现在您已经纠正了编辑中的错误,我敢打赌您的代码不会再出现同样的问题...?。

标签: csv powershell lookup


【解决方案1】:

我可能更容易处理数组并在循环结束时输出。

$testcsv = Import-Csv $path\mapping.csv
$XmlIn = Get-Content  $path\Scripts\XML.txt
foreach ($row in $testcsv)
{
    $field1 = $row.ORGIGINAL_CODE
    $field2 = $row.NEW_CODE
    Write-Host "$field1 maps to $field2"
    $XmlIn = $XmlIn.Replace($field1,$field2)
}
$XmlIn | Out-File $path\XML.txt

【讨论】:

  • 替换部分对我不起作用,所以我不得不调整该行,它现在可以完美运行。 $testcsv = Import-Csv $path\mapping.csv $XmlIn = Get-Content $path\source.txt foreach ($row in $testcsv) { $field1 = $row.ORIGINAL_CODE $field2 = $row.NEW_CODE Write-Host "$field1 映射到 $field2" $XmlIn = $XmlIn | Foreach-Object { $_ -replace $field1,$field2} } $XmlIn |输出文件 $path\source2.txt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2019-08-26
  • 1970-01-01
  • 2014-09-09
  • 2022-10-05
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多