Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Задать соответствие точному количеству и регистру символов.

Ответить
Настройки темы
PowerShell - Задать соответствие точному количеству и регистру символов.

Новый участник


Сообщения: 44
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте. Для замены целой/части строки я использую данный скрипт:
Скрытый текст
Код: Выделить весь код
$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

Можно ли подправить данный скрипт, чтоб он производил замену в точности учитывая количество и регистр символов?

Отправлено: 15:56, 29-12-2019

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


используйте метод replace вместо оператора -replace
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:40, 29-12-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$samples = Import-Csv 'C:\temp\3\1.txt' -Encoding UTF8 -Delimiter ' ' -Header 'P1','P2'
$InFile = gc 'C:\temp\3\2.txt'
 
$OutFile = foreach ($string in $infile) {
    if ($string -cin $samples.p1) {
    ($samples |? p1 -ceq $string).p2
    }
    else {$string}
}

$OutFile |Out-File 'C:\temp\3\out.txt' -Encoding UTF8

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:26, 29-12-2019 | #3


Новый участник


Сообщения: 44
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Busla:
используйте метод replace вместо оператора -replace »
Вы хотели сказать: оператор -replace заменить на -creplace
Спасибо. С регистром все наладилось, а проблема с почти одинаковыми строками осталась.

Отправлено: 01:25, 30-12-2019 | #4


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
if ($string -cin $samples.p1) {
($samples |? p1 -ceq $string).p2
} »
- это не подойдет для случая:
Цитата temphard:
Для замены ...части строки »

Цитата temphard:
Задача состоит в том, чтобы скрипт выдавал следующее »
по-моему, судя по условию, в Вашем результате ошибка...
Попробуйте:
Код: Выделить весь код
$frep = 'd:\test\1.txt'
$fin = 'd:\test\2.txt'
$fout = 'd:\test\out.txt'
[array]$arr = import-csv $frep -enc utf8 -del ' ' -h 'p1','p2'

gc $fin -enc utf8|%{
	$tmp = $_
	for ($i=0;$i -lt $arr.length;$i++){
		if($tmp -cmatch "\b$($arr[$i].p1)\b"){
			$tmp = $tmp -creplace $arr[$i].p1,$arr[$i].p2
		}
	}
	$tmp
} #|sc $fout -enc utf8
- если вывод в консоль правильный, то удалите символ комментария в последней строке и вывод будет перенаправлен в файл.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 30-12-2019 в 08:10.


Отправлено: 08:05, 30-12-2019 | #5


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата temphard:
Цитата Busla:
используйте метод replace вместо оператора -replace »
Вы хотели сказать: оператор -replace заменить на -creplace »
Я сказал ровно то, что хотел сказать. Операторы -replace и -creplace работают с регулярными выражениями.
Простая замена строк реализована в методе:
Код: Выделить весь код
'AaBcCc'.replace('a','z')
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:19, 30-12-2019 | #6


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата Busla:
работают с регулярными выражениями »
по той же причине:
Цитата temphard:
Для замены ...части строки »
без регулярок, обойтись будет трудно...

Пример текста, для замены части строки - 9 строка
textstroka1
textStroka2
textsTroka3
textstRoka4
textstrOka5
textstroka6
textstroka7
textstroka8
textstroka9 textstroka11
textstroka10
textstroka11

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:34, 30-12-2019 | #7


Новый участник


Сообщения: 44
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
без регулярок, обойтись будет трудно »
Согласен. Поэтому в дальнейшем решил избегать одинаковых строк textstroka1 textstroka11.
Просто использую цифры от 1 до 9 а дальше буквы алфавита:
Скрытый текст
textstroka1
textstroka2
textstroka3
textstroka4
textstroka5
textstroka6
textstroka7
textstroka8
textstroka9
textstrokaА
и т.д.

В итоге код с задачей справляется.
Всем спасибо за помощь и участие.

Отправлено: 00:37, 31-12-2019 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Задать соответствие точному количеству и регистру символов.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Как при запуске автоматически задать соответствие "все процессоры" в диспетчере задач severagent007 Microsoft Windows 7 4 04-01-2013 04:26
Поиск по локальной сети по контексту и по количеству символов. Dalretuo Программное обеспечение Linux и FreeBSD 1 15-01-2011 15:53
Разное - Не могу задать соответствие процессоров Gordon_Freeman0 Microsoft Windows 2000/XP 3 10-08-2010 21:52
CMD/BAT - [решено] Как в CMD задать названию папки неопределенную последовательность символов? Rico Скриптовые языки администрирования Windows 4 25-01-2010 08:16
[решено] Задать соответствие процессу ядра процессора alex911k Microsoft Windows NT/2000/2003 2 18-11-2009 17:57




 
Переход