powershell:使用哈希表替换字符串

时间:2015-11-10 09:54:38

标签: powershell

我的文件需要根据CSV中提供的映射进行修改。我想读取我的txt文件的每一行,并根据指定的值是否存在,我想根据我的CSV文件(映射)替换该行中的其他字符串。为此,我使用了HashTable。这是我的ps脚本:

$file ="path\map.csv"
$mapping = Import-CSV $file -Encoding UTF8 -Delimiter ";"
$table = $mapping | Group-Object -AsHashTable -AsString -Property Name

$original_file = "path\input.txt"
$destination_file = "path\output.txt"
$content = Get-Content $original_file

foreach ($line in $content){
    foreach ($e in $table.GetEnumerator()) {
    if ($line -like "$($e.Name)") { 
    $line = $line -replace $e.Values.old_category, $e.Values.new_category
    $line = $line -replace $e.Values.old_type, $e.Values.new_type
    }
    }
}

Set-Content -Path $destination_file -Value $content

我的map.csv如下所示:

Name;new_category;new_type;old_category;old_type
alfa;new_category1;new_type1;old_category1;old_type1
beta;new_category2;new_type2;old_category2;old_type2
gamma;new_category3;new_type3;old_category3;old_type3

我的input.txt内容是:

bla bla "bla"

buuu buuu 123456 "test"
"gamma" "old_category3" "old_type3"
alfa 

当我运行此脚本时,它会创建与初始文件完全相同的输出。有人能告诉我为什么它没有改变" gamma"根据我的映射显示?

提前致谢

1 个答案:

答案 0 :(得分:1)

要改变一些事情。

首先,不需要将$mapping更改为哈希,Import-Csv已经为您提供了一个可以使用的对象数组。

其次,如果要更新$content的元素,则需要使用for循环,以便您可以直接访问修改它们。使用foreach在管道中创建一个新变量,您之前修改过它,但之后再也没有将其写回$content

下面应该有效:

$file ="map.csv"
$mapping = Import-CSV $file -Encoding UTF8 -Delimiter ";"

$original_file = "input.txt"
$destination_file = "output.txt"
$content = Get-Content $original_file

for($i=0; $i -lt $content.length; $i++) {
  foreach($map in $mapping) {
    if ($content[$i] -like "*$($map.Name)*") { 
      $content[$i] = $content[$i] -replace $map.old_category, $map.new_category
      $content[$i] = $content[$i] -replace $map.old_type, $map.new_type
    }
  }
}

Set-Content -Path $destination_file -Value $content