我正在寻找使用其他文件中的字符串替换一个文件中的一个字符串的解决方案。
假设我有两个txt文件:
file1
serial_1 serialN1
serial_2 serialN2
file2的
something serial_3 serialN1
something serial_4 serialN2
我希望将serial_3
替换为serial_1
,将serial_4
替换为serial_2
。
所以我想从file2
搜索file1
第二列(serialN)中的数字,并在serialN匹配第一个文件中的条目时替换file2
中的“领先”序列号。< / p>
到目前为止我在PowerShell中所拥有的内容:
$source = Get-Content file1
foreach ($line in $source){
$position_source = ($line.Split())[1]
$serial_source = ($line.split())[0]
$destination = Get-Content file2
foreach ($destination_line in $destination){
$position_destination = ($destination_line.Split())[2]
if ($position_destination -eq $position_source){
$serial_destination = ($destination_line.Split())[1]
}
}
}
这很好用,现在我想在$serial_source
中用$serial_destination
代替file2
。怎么做?
答案 0 :(得分:1)
你可能想尝试这样的事情
$replacementDict = @{}
$sourceLines = Get-Content file1
foreach ($line in $sourceLines) {
$parts = $line.Split()
$position = $parts[1]
$serial = $parts[0]
$replacementDict.Add($position, $serial)
}
(Get-Content file2) |
% {
$parts = $_.Split()
$position = $parts[2]
if ($replacementDict.($position)) {
$parts[1] = $replacementDict.$position
}
$parts -join ' '
} | Set-Content -Encoding UTF8 file2
在您的初始代码中,您多次读取第二个文件(每行file1
一次),这会浪费资源,这可能会导致多次重写file2
实现。
上面的代码首先创建一个来自file1
的字典/哈希表,它将您的“位置”映射到连续出版物,然后在第二部分中,如果找到它们的“位置”,则替换file2
的内容。字典/哈希表。所以这两个文件只读一次。
请注意我Get-Content file2
周围的附加括号,以确保一次读取文件,然后才通过管道传输内容,否则file2
仍然可能在Set-Content
已经尝试覆盖它的管道末尾打开以读取其内容。
最后注意:上述方法可能会更改您的文件编码,因此您可能需要在必要时进行调整。