temphard
29-12-2019, 15:56
Здравствуйте. Для замены целой/части строки я использую данный скрипт:
$samples = Import-Csv '1.txt' -Encoding UTF8 -Delimiter ' ' -Header 'P1','P2' | select @{N='P1';E = {[regex]::Escape($_.P1)}},P2
$InFile = '2.txt'
$OutFile = 'out.txt'
# $JobCount = (gwmi win32_processor | measure NumberOfCores -S).Sum
$JobCount = 4 # количество одновременно выполняющихся скрипт-блоков $Job_ReplaceText
$TextBlockSize = 10000 # по сколько строк считывать для параллельной обработки в каждом скрипт-блоке $Job_ReplaceText
$Job_ReplaceText =
{
foreach($sample in $args[1])
{
$args[0] = $args[0] -replace $sample.P1,$sample.P2
}
Return $args[0]
}
$n = 1
$null | Set-Content $OutFile
foreach ($block in Get-Content $InFile -ReadCount $TextBlockSize -Encoding UTF8)
{
Start-Job -Name "Replace-$(($n++))" -ArgumentList $block,$samples -ScriptBlock $Job_ReplaceText
if ($n -gt $JobCount)
{
$n = 1
Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8
Get-Job Replace-* | Remove-Job
}
}
Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8
Get-Job Replace-* | Remove-Job
Проблема в том, что скрипт не чувствителен к регистру и точности строки/части, которую необходимо заменить.
Например в файле 1.txt подготовлены строки для замены (вначале стоит то, что искать а через пробел то, чем это заменить):
textstroka1 newstroka1text
textstroka2 newstroka2text
textstroka3 newstroka3text
textstroka4 newstroka4text
textstroka5 newstroka5text
textstroka6 newstroka6text
textstroka7 newstroka7text
textstroka8 newstroka8text
textstroka9 newstroka9text
textstroka10 newstroka000text
textstroka11 newstroka0000text
В файле 2.txt содержится текст:
textstroka1
textStroka2
textsTroka3
textstRoka4
textstrOka5
textstroka6
textstroka7
textstroka8
textstroka9
textstroka10
textstroka11
Результат работы скрипта получается такой, то есть строки 2,3,4 и 5 не должны быть изменены, так как регистр некоторых букв не соответствует, поисковому запросу. Кроме того строки 10 и 11 заменены некорректно, потому что не учтены все символы при поиске:
newstroka1text
newstroka2text
newstroka3text
newstroka4text
newstroka5text
newstroka6text
newstroka7text
newstroka8text
newstroka9text
newstroka1text0
newstroka1text1
Задача состоит в том, чтобы скрипт выдавал следующее:
newstroka1
textStroka2
textsTroka3
textstRoka4
textstrOka5
newstroka6
newstroka7
newstroka8
newstroka9
newstroka000text
newstroka0000text
Можно ли подправить данный скрипт, чтоб он производил замену в точности учитывая количество и регистр символов?
$samples = Import-Csv '1.txt' -Encoding UTF8 -Delimiter ' ' -Header 'P1','P2' | select @{N='P1';E = {[regex]::Escape($_.P1)}},P2
$InFile = '2.txt'
$OutFile = 'out.txt'
# $JobCount = (gwmi win32_processor | measure NumberOfCores -S).Sum
$JobCount = 4 # количество одновременно выполняющихся скрипт-блоков $Job_ReplaceText
$TextBlockSize = 10000 # по сколько строк считывать для параллельной обработки в каждом скрипт-блоке $Job_ReplaceText
$Job_ReplaceText =
{
foreach($sample in $args[1])
{
$args[0] = $args[0] -replace $sample.P1,$sample.P2
}
Return $args[0]
}
$n = 1
$null | Set-Content $OutFile
foreach ($block in Get-Content $InFile -ReadCount $TextBlockSize -Encoding UTF8)
{
Start-Job -Name "Replace-$(($n++))" -ArgumentList $block,$samples -ScriptBlock $Job_ReplaceText
if ($n -gt $JobCount)
{
$n = 1
Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8
Get-Job Replace-* | Remove-Job
}
}
Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8
Get-Job Replace-* | Remove-Job
Проблема в том, что скрипт не чувствителен к регистру и точности строки/части, которую необходимо заменить.
Например в файле 1.txt подготовлены строки для замены (вначале стоит то, что искать а через пробел то, чем это заменить):
textstroka1 newstroka1text
textstroka2 newstroka2text
textstroka3 newstroka3text
textstroka4 newstroka4text
textstroka5 newstroka5text
textstroka6 newstroka6text
textstroka7 newstroka7text
textstroka8 newstroka8text
textstroka9 newstroka9text
textstroka10 newstroka000text
textstroka11 newstroka0000text
В файле 2.txt содержится текст:
textstroka1
textStroka2
textsTroka3
textstRoka4
textstrOka5
textstroka6
textstroka7
textstroka8
textstroka9
textstroka10
textstroka11
Результат работы скрипта получается такой, то есть строки 2,3,4 и 5 не должны быть изменены, так как регистр некоторых букв не соответствует, поисковому запросу. Кроме того строки 10 и 11 заменены некорректно, потому что не учтены все символы при поиске:
newstroka1text
newstroka2text
newstroka3text
newstroka4text
newstroka5text
newstroka6text
newstroka7text
newstroka8text
newstroka9text
newstroka1text0
newstroka1text1
Задача состоит в том, чтобы скрипт выдавал следующее:
newstroka1
textStroka2
textsTroka3
textstRoka4
textstrOka5
newstroka6
newstroka7
newstroka8
newstroka9
newstroka000text
newstroka0000text
Можно ли подправить данный скрипт, чтоб он производил замену в точности учитывая количество и регистр символов?