Задать вопрос
@fishmen
Новичёк

Почему замена строк местами не работает на большом документе?

@echo off
setlocal EnableDelayedExpansion

rem Указываем имя файла, в котором нужно поменять строки местами
set "filename=%~dp0zagolovki.txt"

rem Открываем файл для чтения
set "file=%filename%"

rem Считываем файл построчно и сохраняем в массив
set i=0
for /f "delims=" %%a in (%file%) do (
  set /A i+=1
  set "line[!i!]=%%a"
)

rem Поменяем 1 и 3 строки местами
set "temp=!line[1]!"
set "line[1]=!line[3]!"
set "line[3]=!temp!"

rem Открываем файл для записи
(
for /L %%i in (1,1,%i%) do (
  echo !line[%%i]!
)
)>"%filename%"

rem Закрываем файл
endlocal

У меня есть код который меняет местами 1 и 3 строки.Он работает как надо но только на небольших документах.
При попытке заменить строки в файле в 1.5 мб он просто записывает файл размером 0 байт.
Подскажите почему так происходит и можно ли это исправить?
  • Вопрос задан
  • 162 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
(Не очень понятно, в чём состоит «открытие файла на чтение»: по моему, просто присваивается значение одной переменной другой.)

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

Первые три строки можно получить так:
(
set /p "s1="
set /p "s2="
set /p "s3="
) <input.txt

Вывести содержимое файла, начиная с четвёртой строки можно, например, с помощью утилиты more:
more +3 input.txt >>output.txt
или
more +3 <input.txt >>output.txt

А в целом:
(
set /p "s1="
set /p "s2="
set /p "s3="
echo !s3!
echo !s2!
echo !s1!
more
) <input.txt >output.txt
del input.txt
ren output.txt input.txt

В этом случае, возможно, вместо
more
для перехвата оставшихся строк будет лучше
find /v ""
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы