我目前正在尝试逐行解析文件并将其用于指令替换。
在我的第一个名为 filein.txt 的文件中,具有此类信息(信息不固定):
test 1
test
test 3
test 4
test test
Mr Test
在名为 filechg.txt 的第二个文件中,我需要通过在文件 filein.txt
中找到字符串来替换其上的字符。信息看起来像CSV
6672;Mr test;Ticket;Off;Active;F;
5948;test 4;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;
5948;test 2;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;
5948;test 6;Ticket;Off;Active;F;
6672;test 7;Ticket;Off;Active;F;
5948;tests;Ticket;Off;Active;F;
6672;Mr test;Ticket;Off;Active;F;
通过查找字符串,我替换了字符串; F;通过; T;
为此,我正在这样做:
filechg= 'c:\temp\filechg.txt'
filein= 'c:\temp\filein.txt'
foreach($line in $filein) {
Get-Content $filechg | % {$_ -replace "($line.*)F;", '$1T;'} | Set-Content $filechg
}
似乎我可以在foreach指令中回显变量“行”,但不能将其用于替换指令。
响应应为:
6672;Mr test;Ticket;Off;Active;T;
5948;test 4;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;
5948;test 2;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;
5948;test 6;Ticket;Off;Active;T;
6672;test 7;Ticket;Off;Active;T;
5948;tests;Ticket;Off;Active;T;
6672;Mr test;Ticket;Off;Active;T;
您能帮我解决这个问题吗?
亲切的问候
答案 0 :(得分:2)
您只需要读入文件内容,但是至少可以读一次脚本不读的内容。
并将所有替换项应用于读取变量,此处为itertools.groupby
>>> from itertools import groupby
>>> f = lambda l: l[-1]
>>> [[k]+[l[0] for l in v] for k,v in groupby(sorted(arr, key=f), f)]
[['abd', 'bad'], ['act', 'act', 'cat', 'tac'], ['adf', 'fad']]
示例显示输出(取消注释最后一行以将结果写入文件)
$content
filein中的行$filechg = '.\filechg.txt'
$filein = '.\filein.txt'
$content = Get-Content $filechg
foreach($line in (Get-Content $filein)) {
$content = $content -replace "($line.*)F;", '$1T;'
}
$content
# $content | Set-Content $filechg
呈现了所有其他多余的内容,因为filechg的所有行中都存在此字符串。为了避免这种情况,请在filein行的末尾添加一个6672;Mr test;Ticket;OfT;Active;T;
5948;test 4;Ticket;OfT;Active;T;
6672;Mr test;Ticket;OfT;Active;T;
5948;test 2;Ticket;Off;Active;T;
6672;Mr test;Ticket;OfT;Active;T;
5948;test 6;Ticket;Off;Active;T;
6672;test 7;Ticket;Off;Active;T;
5948;tests;Ticket;Off;Active;T;
6672;Mr test;Ticket;OfT;Active;T;
。