Функция DosTips RTRIM, которую цитирует Бен Хокинг, может использоваться для создания сценария, который может корректно обрезать каждую строку в текстовом файле.Тем не менее, функция является относительно медленной.
Пользователь DosTips (и модератор) aGerman разработали очень эффективный алгоритм правой подстройки .Он реализовал алгоритм в виде пакетного «макроса» - интересной концепции хранения сложных мини-скриптов в переменных среды, которые могут быть выполнены из памяти.Макросы с аргументами сами по себе являются главной темой обсуждения, которая не имеет отношения к этому вопросу.
Я извлек алгоритм Алгермана и поместил его в следующий пакетный скрипт.Сценарий ожидает имя текстового файла в качестве единственного параметра и пересекает пробелы справа от каждой строки в файле.
@echo off
setlocal enableDelayedExpansion
set "spcs= "
for /l %%n in (1 1 12) do set "spcs=!spcs!!spcs!"
findstr /n "^" "%~1" >"%~1.tmp"
setlocal disableDelayedExpansion
(
for /f "usebackq delims=" %%L in ("%~1.tmp") do (
set "ln=%%L"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
set /a "n=4096"
for /l %%i in (1 1 13) do (
if defined ln for %%n in (!n!) do (
if "!ln:~-%%n!"=="!spcs:~-%%n!" set "ln=!ln:~0,-%%n!"
set /a "n/=2"
)
)
echo(!ln!
endlocal
)
) >"%~1"
del "%~1.tmp" 2>nul
Если сценарий называется rtrimFile.bat, его можно вызватьиз командной строки:
rtrimFile "fileName.txt"
Замечание о производительности Оригинальная функция DosTips rtrim выполняет линейный поиск и по умолчанию обрезает до 32 пробелов.Он должен выполнять итерацию один раз за пробел.
Алгоритм aGerman использует бинарный поиск и способен обрезать максимальный размер строки, допустимый для пакета (до ~ 8k пробелов), за 13 итераций.
К сожалению, пакет очень медленный, когда дело доходит до обработки текста.Даже с эффективной функцией rtrim, мне нужно ~ 70 секунд, чтобы обрезать файл размером 1 МБ на моей машине.Проблема в том, что простое чтение и запись файла без каких-либо изменений занимает значительное время.Этот ответ использует цикл FOR для чтения файла, в сочетании с FINDSTR, чтобы префикс каждой строки с номером строки, чтобы сохранить пустые строки.Это переключает отложенное расширение, чтобы предотвратить повреждение !
, и использует операцию поиска и замены, чтобы удалить префикс номера строки из каждой строки.Все это еще до того, как он начнет работать.
Производительность можно почти удвоить, если использовать механизм чтения альтернативных файлов , использующий set /p
.Однако метод set / p ограничен ~ 1 Кбайт на строку, и он удаляет конечные управляющие символы из каждой строки.
Если вам необходимо регулярно обрезать большие файлы, то даже удвоение производительности, вероятно, неадекватны.Время для загрузки (если возможно) любой из многих утилит, которые могут обработать файл в мгновение ока.
Если вы не можете использовать не родное программное обеспечение, тогда вы можете попробовать VBScript или JScript с помощьюпакетная команда CSCRIPT.Любой из них был бы НАМНОГО быстрее.
ОБНОВЛЕНИЕ - Быстрое решение с JREPL.BAT
JREPL.BAT - это утилита поиска / замены регулярного выраженияэто может очень эффективно решить проблему.Это чистый скрипт (гибридный пакет / JScript), который работает на любом компьютере с Windows начиная с XP.Не требуются сторонние exe-файлы.
С JREPL.BAT где-нибудь в вашей переменной PATH вы можете убрать конечные пробелы из файла "test.txt" с помощью этой простой команды:
jrepl " +$" "" /f test.txt /o -
ЕслиВы помещаете команду в пакетный скрипт, затем перед командой необходимо указать CALL:
call jrepl " +$" "" /f test.txt /o -