Я не знаю Python, но похоже, что вы выполняете буквенные замены строк в скрипте Python. В Powershell оператор -replace
является поиском / заменой регулярного выражения. Я бы преобразовал Powershell в использование метода замены в классе строк (или, чтобы ответить на исходный вопрос, я думаю, что ваш Powershell неэффективен).
ForEach ($file in Get-ChildItem C:\temp\csv\*.csv)
{
$content = Get-Content -path $file
# look close, not much changes
$content | foreach {$_.Replace($SearchStr, $ReplaceStr)} | Set-Content $file
}
РЕДАКТИРОВАТЬ После дальнейшего рассмотрения, я думаю, я вижу другое (возможно, более важное) отличие в версиях. Похоже, что версия Python читает весь файл в одну строку. Версия Powershell, с другой стороны, читает массив строк .
В справке по Get-Content
упоминается параметр ReadCount
, который может повлиять на производительность. Установка этого счетчика в -1, кажется, читает весь файл в один массив. Это будет означать, что вы передаете массив через конвейер вместо отдельных строк, но простое изменение в коде будет иметь дело с этим:
# $content is now an array
$content | % { $_ } | % {$_.Replace($SearchStr, $ReplaceStr)} | Set-Content $file
Если вы хотите прочитать весь файл в одну строку, как кажется в версии Python, просто вызовите метод .NET напрямую:
# now you have to make sure to use a FULL RESOLVED PATH
$content = [System.IO.File]::ReadAllText($file.FullName)
$content.Replace($SearchStr, $ReplaceStr) | Set-Content $file
Это не совсем как "Powershell-y", так как вы используете API .NET напрямую вместо аналогичных командлетов, но они предоставляют эту возможность в те моменты, когда вам это нужно.