Пакетный скрипт для поиска и замены строки в текстовом файле в течение минуты для файлов до 12 МБ
Я написал пакетный скрипт для замены строки в текстовом файле.
Ниже приведен сценарий.
@echo off &setlocal
set "search=%1"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%
Но для файла размером 12 МБ он приближается к 7 мин. Я хочу, чтобы это было меньше минуты. Можем ли мы использовать команду find или findstr, чтобы сократить время?
Ответы
Ответ 1
Сделайте снимок:
@echo off
setlocal
call :FindReplace "findstr" "replacestr" input.txt
exit /b
:FindReplace <findstr> <replstr> <file>
set tmp="%temp%\tmp.txt"
If not exist %temp%\_.vbs call :MakeReplace
for /f "tokens=*" %%a in ('dir "%3" /s /b /a-d /on') do (
for /f "usebackq" %%b in ('Findstr /mic:"%~1" "%%a"') do (
echo(&Echo Replacing "%~1" with "%~2" in file %%~nxa
<%%a cscript //nologo %temp%\_.vbs "%~1" "%~2">%tmp%
if exist %tmp% move /Y %tmp% "%%~dpnxa">nul
)
)
del %temp%\_.vbs
exit /b
:MakeReplace
>%temp%\_.vbs echo with Wscript
>>%temp%\_.vbs echo set args=.arguments
>>%temp%\_.vbs echo .StdOut.Write _
>>%temp%\_.vbs echo Replace(.StdIn.ReadAll,args(0),args(1),1,-1,1)
>>%temp%\_.vbs echo end with
Ответ 2
Это использует вспомогательный пакетный файл с именем repl.bat
- загрузка с: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
Поместите repl.bat
в ту же папку, что и командный файл, или в папку, repl.bat
на пути.
Repl.bat - это гибридный командный файл с использованием собственных сценариев Windows и намного быстрее, чем обычный пакетный скрипт.
Переключатель L
выполняет поиск текста и заменяет литеральную строку, и я ожидаю, что 12 МБ файл завершится через несколько секунд на современном ПК.
@echo off &setlocal
set "search=%~1"
set "replace=%~2"
set "textfile=Input.txt"
set "newfile=Output.txt"
call repl.bat "%search%" "%replace%" L < "%textfile%" >"%newfile%"
del "%textfile%"
rename "%newfile%" "%textfile%"
Ответ 3
Вариант с использованием Bat/Powershell (необходим.net framework):
replace.bat:
@echo off
call:DoReplace "Findstr" "replacestr" test.txt test1.txt
exit /b
:DoReplace
echo ^(Get-Content "%3"^) ^| ForEach-Object { $_ -replace %1, %2 } ^| Set-Content %4>Rep.ps1
Powershell.exe -executionpolicy ByPass -File Rep.ps1
if exist Rep.ps1 del Rep.ps1
echo Done
pause
Ответ 4
Просто скачайте fart (найдите и замените текст) отсюда
используйте его в CMD (для удобства использования я добавляю папку перда в переменную пути)
вот пример:
fart -r "C:\myfolder\*.*" findSTR replaceSTR
эта команда будет искать в C:\myfolder и всех подпапках и заменить findSTR на replaceSTR
-r означает рекурсивные подсистемы процесса.
пердеть очень быстро и просто
Ответ 5
Как насчет этого, ребята?
set search=%1
set replace=%2
set textfile=Input.txt
set line1=with open('%textfile%', 'rw') as f:
set line2=f.write(f.read().replace('%search%', '%replace%'))
python -c "%line1%%line2%"
Muhahaha
Редактировать:
В сумасшедшем oneliner
python -c "with open('%textfile%', 'rw') as f: f.write(f.read().replace('%search%', '%replace%'))"
Ответ 6
Попробуй это:
@echo off &setlocal
setlocal enabledelayedexpansion
set "search=%1"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
set "line=!line:%search%=%replace%!"
echo(!line!
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%
endlocal