Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

Ответить
Настройки темы
CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

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


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

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


Изменения
Автор: ivanxam
Дата: 20-02-2014
Описание: Дописал
Добрый день, люди добрые помогите, что-то я вообще запутался.
Как удалить последнюю строку в файле? Строку эту я знаю.

Файл 100001.txt
Код: Выделить весь код
20140201.jrn
20140202.jrn
20140203.jrn
20140204.jrn
20140205.jrn
20140206.jrn
20140207.jrn
20140208.jrn
20140209.jrn
20140210.jrn
Или можно выполнить dir без последней строки(файла)

Отправлено: 16:03, 20-02-2014

 

Ветеран


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

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


Цитата ivanxam:
что-то я вообще запутался »
Решить эту задачу в общем виде (т. е. и с учётом пустых строк, и без потери символов) на языке командной строки действительно сложно.


Цитата ivanxam:
Строку эту я знаю »
А что изменится в решении, если Вы эту строку не знаете?


Цитата ivanxam:
Как удалить последнюю строку в файле? »
В Вашем случае так:

Код: Выделить весь код
@echo off
for /f "usebackq" %%i in ("100001.txt") do (
 set /a m+=1
)
(
for /f "usebackq delims=" %%i in ("100001.txt") do (
 set /a n+=1
 call echo %%n%%|>nul findstr /vxc:%m%&& echo %%i
))>.tmp
move .tmp "100001.txt">nul

Цитата ivanxam:
Или можно выполнить dir без последней строки(файла) »
Можно ли выполнить команду "dir", чтобы в её выводе не было последней строки?

Вариант №1.

Код: Выделить весь код
@echo off
for /f "delims=" %%i in ('dir /a-d /b *.jrn') do (
 set /a m+=1
)
(
for /f "delims=" %%i in ('dir /a-d /b *.jrn') do (
 set /a n+=1
 call echo %%n%%|>nul findstr /vxc:%m%&& echo %%i
))>"100001.txt"
Вариант №2.

Код: Выделить весь код
@echo off
for %%i in (*.jrn) do (
 set /a m+=1
 >nul dir /a-d /b %%i
)
(
for %%i in (*.jrn) do (
 set /a n+=1
 call echo %%n%%|>nul findstr /vxc:%m%&& dir /a-d /b %%i
))>"100001.txt"
Вариант №3.

Если в выводе нужны только имена файлов с расширениями (как у Вас), то можно обойтись без команды "dir".

Код: Выделить весь код
@echo off
for %%i in (*.jrn) do (
 set /a m+=1
)
(
for %%i in (*.jrn) do (
 set /a n+=1
 call echo %%n%%|>nul findstr /vxc:%m%&& echo %%i
))>"100001.txt"

P. S. Команда "@echo off" обязательна во всех приведённых кодах.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:56, 21-02-2014 | #2



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

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


Ветеран


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

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


Вариант 4
Код: Выделить весь код
@echo off

for /f "delims=" %%a in (out.txt) do set "old=%%a"
findstr /vc:"%old%" "out.txt">>new.txt
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:46, 21-02-2014 | #3


Ветеран


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

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


sov44, а если в выводе команды, например, такой:
Код: Выделить весь код
for /f "tokens=*" %%i in ('dir /a-d /b /s') do echo %%~nxi
, таких "%old%" будет несколько?

По этой причине я не рассматривал этот вариант.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:07, 21-02-2014 | #4


Ветеран


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

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


Я бы попробовал так:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=C:\Песочница\040\100001.txt

call :GetTemporaryName

if exist "%sSourceFile%" (
	for /f "usebackq delims=" %%i in (
		`type "%sSourceFile%"^|find.exe /v /c ""`
	) do set /a iTotalLines = %%i

	set /a iNeedLines = iTotalLines - 1

	>"%TemporaryName%" (
		for /f "usebackq tokens=1* delims=[]" %%i in (
			`type "%sSourceFile%"^|find.exe /v /n ""`
		) do if %%i leq !iNeedLines! echo.%%j
	)

	>nul copy /y "%sSourceFile%" "%sSourceFile%.bak"
	>nul copy /y "%TemporaryName%" "%sSourceFile%"
	del /f /q "%TemporaryName%"
) else (
	echo Source file [%sSourceFile%] not found.
	exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem 
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
    setlocal enableextensions enabledelayedexpansion

:NextName
    set sTempName=%temp%\temp%random%.tmp

    if exist "%sTempName%" goto :NextName

    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sTempName%
    exit /b 0
rem ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:25, 21-02-2014 | #5


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


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

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


Всем огромное спасибо.

Отправлено: 14:42, 21-02-2014 | #6


Ветеран


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

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


Цитата Georgio:
sov44, а если в выводе команды, например, такой: »
Цитата ivanxam:
Как удалить последнюю строку в файле? »
Georgio, т.з. сформулировано чётко.

вторую часть вопроса не рассматривал, т. к. не понятно. по какому критерию считать последнюю строку
Цитата ivanxam:
выполнить dir без последней строки(файла) »

Последний раз редактировалось sov44, 21-02-2014 в 17:36.


Отправлено: 17:26, 21-02-2014 | #7


Ветеран


Contributor


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

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


Прямолинейно
Код: Выделить весь код
@Echo Off

Set "File=100001.txt"

SetLocal EnableExtensions EnableDelayedExpansion

Set /A N=0
FOR /F "usebackq delims=" %%i in (`Type "%File%"`) do Set /A N+=1

Set /A M=%N%

Set /A N=0
FOR /F "usebackq delims=" %%i in (`Type "%File%"`) do Set /A N+=1 & If !N!==1 (Echo %%i>"%File%") Else (If !N! LSS %M% Echo %%i>>"%File%")
Не очень понял насчет Dir без последней строки. Вы что, командой Dir в файл 100001.txt заносите имена файлов? А у файлов имена ГГГГММДД.JRN ? Тогда возможно более короткое решение ...

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 18:16, 21-02-2014 | #8


Ветеран


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

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


Цитата megaloman:
Прямолинейно »
megaloman, тут опять вопрос с пропуском пустых строк при разборе по «for /f». В данном конкретном случае (разбор «dir /b») сие, конечно, не существенно.

Цитата megaloman:
Вы что, командой Dir в файл 100001.txt заносите имена файлов? »
Я понял, что так.

Цитата megaloman:
Тогда возможно более короткое решение ... »
Выкладывайте, конечно.

Отправлено: 18:33, 21-02-2014 | #9


Ветеран


Contributor


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

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


Опять прямолинейно, если в файле 100001.txt не важен порядок (по убыванию-возрастанию)
Код: Выделить весь код
@Echo Off

Set "File=100001.txt"
Set "Mask=20??????.jrn"

Del "%File%" 2>Nul
FOR /F "skip=1 usebackq delims=" %%i in (`Dir "%Mask%" /b /A:-D /O:-N  2^>nul`) Do Echo %%i>>"%File%"
Увы, если важен порядок, придётся добавить за этим приведенным кодом сортировку, что не короче предыдущего решения
Код: Выделить весь код
SetLocal EnableExtensions EnableDelayedExpansion
Set /A N=0
FOR /F "usebackq delims=" %%i in (`Type "%File%"^|Sort`) Do Set /A N+=1 & If !N!==1 (Echo %%i>"%File%") Else (Echo %%i>>"%File%")

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 19:10, 21-02-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удалить пустую строку в файле .txt denntl Скриптовые языки администрирования Windows 2 18-07-2013 11:48
Любой язык - [решено] Как выделить каждую определенною строку в текстовом файле KooDI Скриптовые языки администрирования Windows 6 05-03-2013 21:47
VBS/WSH/JS - [решено] Как изменить конкретную строку в текстовом файле с помощью Vbscript neo21 Скриптовые языки администрирования Windows 8 30-10-2011 15:47
CMD/BAT - [решено] Удалить в текстовом файле по условию AlexVong Скриптовые языки администрирования Windows 1 21-11-2010 11:53
[решено] Как удалить строки в текстовом файле при отсутсвии файла в опрелеленном месте? Pozia AutoIt 23 14-05-2009 21:41




 
Переход