2015-11-10 47 views
3

我有需要根據CSV中提供的映射修改的文件。我想讀取我的txt文件的每一行,並根據指定的值存在,我想根據我的CSV文件(映射)替換該行中的其他字符串。爲此,我使用了HashTable。這是我PS的腳本:powershell:使用散列表替換字符串

$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

幾件事情要改變。

首先,不需要將$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 
+0

工作就像一個魅力。非常感謝 :) – MacieQ

相關問題