Показать полную графическую версию : [решено] Как удалить последнюю строку в текстовом файле?
Anufriev
17-09-2018, 06:18
Скажите, коллега, подпись всегда одна и та же? А если могут быть разные — не попадётся ли как-нибудь однажды в подписи символ 0x0A или 0x0D, сиречь LineFeed, або CarriageReturn? Тройку нулевых символов я там уже вижу. »
Подпись может меняться, эм... не, не встречал я таких символов
Ну, WSH везде есть. »
Есть то она есть, но у нас беда с ИБ, прилетает по шапке и доказать, что это необходимо в работе практически не возможно, не любят они скрипты на пользовательских компах...
не любят они скрипты на пользовательских компах... »
Если они такие умные не любят — пусть принимают скрипты, проверяют, снабжают своей цифровой подписью и возвращают вобрат для использования. А mshta.exe они ещё случайно не запретили пользовать, а?
Anufriev
17-09-2018, 06:52
А mshta.exe они ещё случайно не запретили пользовать, а? »
пока что не добрались))))
Ну, WSH везде есть. »
ms-dos, win 3.11, win 95? :search: :)
YuS_2, я имел в виду — из нонешних ОС.
нонешних ОС. »
дык, нонешние это уже семерка, восьмерка да десятка (там posh везде есть)... а остальные в музей пора передавать, на вечное хранение :)
YuS_2, смотря где. У меня и Windows NT 4.0 Workstation не так давно были вполне рабочими станциями. Что делать… За неимением гербовой — пишем на простой :(.
megaloman
17-09-2018, 11:53
Anufriev, с голым CMD Ваша задача вряд ли может быть решена. Если принять, как в вашем примере, что строки разделяются символами 0D 0A (то есть 13 10) и последняя строка этими символами не завершается, в подписи эта парочка не присутствует, то@set @E=1; /*
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=*.xml"
FOR %%f IN ("%BoxIn%\%Mask%") DO (
Copy "%%f" "%BoxOut%\" >nul
Call Cscript //NoLogo /E:jscript "%~dpnx0" "%BoxOut%\%%~nxf"
)
pause
GoTo :Eof
*/
var oArg = WScript.Arguments;
var nArg = oArg.Count();
if (nArg != 1) {
WScript.Echo("Error! Invalid number of arguments!");
WScript.Quit(1);
}
var FText=oArg(0);
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
var InFile;
try {InFile = FSO.OpenTextFile(FText,1);}
catch (e) {
if (e !=0 ) {
WScript.Echo("Error! " + FText + " " + e.description);
WScript.Quit(2);
}
}
var TextAll = InFile.ReadAll();
InFile.Close();
var Nlast=TextAll.lastIndexOf(String.fromCharCode(13,10));
TextAll=TextAll.substr(0,Nlast);
InFile = FSO.OpenTextFile(FText,2);
InFile.Write(TextAll);
InFile.Close();
WScript.Quit(0);
Пропишите пути к вашим входной и выходной папкам.
megaloman
17-09-2018, 12:51
Тихий ужас! Я не понимаю как, но это на представленном примере работает :(@Echo Off
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=*.xml"
FOR %%f IN ("%BoxIn%\%Mask%") DO (
>"%BoxOut%\%%~nxf" (FOR /F "usebackq delims=" %%t IN ("%%f") DO @echo.%%t)
)
GoTo :EofВозможно, из-за какого-то непристойного символа в подписи
Гарантировать, что это будет работать всегда, не берусь.
А так, наверное, более предсказуемо:@Echo Off
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=*.xml"
Set "End=</ESDT_BNK>"
FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Restrict "%%f"
GoTo :Eof
:Restrict
>"%BoxOut%\%~nx1" (FOR /F "usebackq delims=" %%t IN (%1) DO (@echo.%%t) &If /I "%End%"=="%%t" GoTo :Eof)
GoTo :Eof
Возможно, из-за какого-то непристойного символа в подписи »
Из-за тех самых нулевых символов (0x00) в подписи, надо полагать. Стоит их убрать — и подпись остаётся на месте.
Anufriev
17-09-2018, 13:57
А так, наверное, более предсказуемо:
@Echo Off
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Mask=*.xml"
Set "End=</ESDT_BNK>"
FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Restrict "%%f"
GoTo :Eof
:Restrict
>"%BoxOut%\%~nx1" (FOR /F "usebackq delims=" %%t IN (%1) DO (@echo.%%t) &If /I "%End%"=="%%t" GoTo :Eof)
GoTo :Eof »
Взял потестировать этот, пока что работает хорошо, будем понаблюдать))) спасибо огромное!
p.s. пойду свечку поставлю, что бы так работал постоянно)
Удаление любого количества строк от конца текста:
@echo off
set "infile=files.txt"
set "outfile=out.txt"
rem количество удаляемых строк
set k=1
for /f %%a in ('^<"%infile%" more^|find /v /c ""') do set n=%%a
set /a n-=k+1
(for /l %%i in (0,1,%n%) do (
more +%%i "%infile%"|set /p x=^&cmd /v/c "if defined x (echo.!x!) else (echo.)"
))>"%outfile%"
Удаление любого количества строк от конца текста: »
можно и короче:
@echo off
set cns=3
<"file.txt">+ (sort /+2147483647|more +%cns%|sort /+2147483647|findstr /vrc:"^$")& move+ "file.txt"
exit
можно и короче »
промежуточный файл дает значительный прирост скорости :up
только пустые строки съедает...
лучше "findstr ..." заменить на "more +1", правда пустая строка лишняя добавляется в конец файла, но это, наверное, не проблема для .xml
промежуточный файл дает значительный прирост скорости »
согласен, но на удивление sort работает быстро.
на удивление sort работает быстро. »
Тут скорее заслуга не sort. В твоем примере одна команда обрабатывает весь массив текста сразу, в отличие от моего (построчная обработка), что и дает тот самый прирост. Жаль, что в cmd отсутствуют полноценные конвейеры, тогда промежуточный файл не понадобился бы, да и скорость обработки была бы ещё выше...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.