gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:22:26 26 4
gpt4 key购买 nike

我有一些文件需要根据 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 ”的那条线吗?

提前致谢

最佳答案

有几件事需要改变。

首先,无需将 $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

关于powershell:使用哈希表替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33627222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com