PDA

Показать полную графическую версию : [решено] Как удалить последнюю строку в текстовом файле?


Страниц : 1 [2]

Anufriev
17-09-2018, 06:18
Скажите, коллега, подпись всегда одна и та же? А если могут быть разные — не попадётся ли как-нибудь однажды в подписи символ 0x0A или 0x0D, сиречь LineFeed, або CarriageReturn? Тройку нулевых символов я там уже вижу. »

Подпись может меняться, эм... не, не встречал я таких символов

Ну, WSH везде есть. »

Есть то она есть, но у нас беда с ИБ, прилетает по шапке и доказать, что это необходимо в работе практически не возможно, не любят они скрипты на пользовательских компах...

Iska
17-09-2018, 06:45
не любят они скрипты на пользовательских компах... »
Если они такие умные не любят — пусть принимают скрипты, проверяют, снабжают своей цифровой подписью и возвращают вобрат для использования. А mshta.exe они ещё случайно не запретили пользовать, а?

Anufriev
17-09-2018, 06:52
А mshta.exe они ещё случайно не запретили пользовать, а? »

пока что не добрались))))

YuS_2
17-09-2018, 07:53
Ну, WSH везде есть. »
ms-dos, win 3.11, win 95? :search: :)

Iska
17-09-2018, 10:14
YuS_2, я имел в виду — из нонешних ОС.

YuS_2
17-09-2018, 11:09
нонешних ОС. »
дык, нонешние это уже семерка, восьмерка да десятка (там posh везде есть)... а остальные в музей пора передавать, на вечное хранение :)

Iska
17-09-2018, 11:19
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

Iska
17-09-2018, 13:26
Возможно, из-за какого-то непристойного символа в подписи »
Из-за тех самых нулевых символов (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. пойду свечку поставлю, что бы так работал постоянно)

YuS_2
17-09-2018, 14:49
Удаление любого количества строк от конца текста:
@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%"

alpap
17-09-2018, 18:04
Удаление любого количества строк от конца текста: »
можно и короче:

@echo off
set cns=3
<"file.txt">+ (sort /+2147483647|more +%cns%|sort /+2147483647|findstr /vrc:"^$")& move+ "file.txt"
exit

YuS_2
17-09-2018, 18:37
можно и короче »
промежуточный файл дает значительный прирост скорости :up
только пустые строки съедает...
лучше "findstr ..." заменить на "more +1", правда пустая строка лишняя добавляется в конец файла, но это, наверное, не проблема для .xml

alpap
17-09-2018, 20:19
промежуточный файл дает значительный прирост скорости »
согласен, но на удивление sort работает быстро.

YuS_2
18-09-2018, 08:33
на удивление sort работает быстро. »
Тут скорее заслуга не sort. В твоем примере одна команда обрабатывает весь массив текста сразу, в отличие от моего (построчная обработка), что и дает тот самый прирост. Жаль, что в cmd отсутствуют полноценные конвейеры, тогда промежуточный файл не понадобился бы, да и скорость обработки была бы ещё выше...




© OSzone.net 2001-2012