Показать полную графическую версию : [решено] Помогите удалить из txt ненужные строки
Здравствуйте,
Помогите удалить всё до первого проблела
qwerty - tgbvfrw
asdfg - hjkl
zxcvbnm - aaaa
asdfghjjj - ssssssss
rtyuiopp - zcdsc
ghjklhgg - saffdsfsd
qaswefg - htyytjytj
В общем надо что бы после запуска вашего скрипта, в текстовом файле оставалось только.
qwerty
asdfg
zxcvbnm
asdfghjjj
rtyuiopp
ghjklhgg
qaswefg
Спасибо за ранее!!
удалить всё до первого проблела »
Может быть, после первого пробела, включительно?
@echo off
setlocal enableextensions enabledelayedexpansion
set sFile=%~1
if defined sFile (
if exist "%sFile%" (
call :GetTemporaryName
>"!TemporaryName!" (
for /f "usebackq delims= " %%i in ("%sFile%") do (
echo.%%i
)
)
>nul copy /y "%sFile%" "%~dpn1.bak"
>nul copy /y "!TemporaryName!" "%sFile%"
del /f /q "!TemporaryName!"
) else (
echo Can't find source file [%sFile%].
)
) else (
echo Usage: %~nx0 ^<Source file^>
)
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 ==========================================================================
Может быть, после первого пробела, включительно? »
да) вы правы я просто торопился.
Iska, Спасибо конечно за скриптик, не ожидал что будет такой большой. Может вы мой подправите что бы он работал так же как он работает, вот только что-бы скриптик поумнее получился и писал не в лог log.txt а в xxx.txt надо что бы удалял не нужное и всё
а если быть точнее то просто читаем xxx.txt у убираем в нем не нужное.
А в моём примере я просто из xxx.txt в лог нужные мне строки переношу.
@echo off
echo 0>log.txt
for /f "tokens=1,2 usebackq" %%a in ("xxx.txt") do (
echo %%a
)>>log.txt
фигню наверно я сделал но оно работает =)
не ожидал что будет такой большой »
Вы ведь написали:
в текстовом файле оставалось только »
т.е. — в том же файле.
Если усечённые строки сохранять в новый файл — надобность в промежуточном временном файде отпадает (не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=%~1
set sDestFile=log.txt
if defined sSourceFile (
if exist "%sSourceFile%" (
>"%sDestFile%" (
for /f "usebackq delims= " %%i in ("%sSourceFile%") do (
echo.%%i
)
)
) else (
echo Can't find source file [%sSourceFile%].
)
) else (
echo Usage: %~nx0 ^<Source file^>
)
endlocal
exit /b 0
echo 0>log.txt»
Не делайте так. Лучше проверьте, существует ли файл, и если существует — удалите.
for /f "tokens=1,2 …»
Зачем Вам второй токен? Вы его не пользуете.
Смотрите как работает мой скрипт,
1, чистит файл log.txt
2, ищет в файле xxx.txt всё что начинается с первой строки
3, и выводит всё что нашел в консоль
4, потом просто заполняет опять log.txt который ранее был очищен.
А вот что надо мне.
1, ищет в файле file1.txt всё до первого пробела
2, и выводит всё что нашел в консоль
3, потом чистит этот файл file1.txt
4, и в него же записывает то что вывел в консоль
@echo off
for /f "usebackq delims= " %%a in ("file1.txt") do (
echo %%a>file1.txt
)
Просто если так сделать то он записывает только последнюю строчку из наиденного
в общем добился я того что мне надо, пока-что вот так
@echo off
echo 0>file2.txt
for /f "usebackq delims= " %%a in ("file1.txt") do (
echo.%%a)>>file2.txt
а хотелось бы что-бы работало вот так
for /f "usebackq delims= " %%a in ("file1.txt") do (
echo.%%a)>file1.txt
megaloman
13-08-2013, 19:16
Не получится как хочется, разве что как-то исхитриться исх файл в массив записать. Работаем через промежуточный файл@Echo Off
Set "FileName=txt.txt"
del "~%FileName%.tmp" 2>Nul
FOR /F "tokens=1 usebackq delims= " %%i in ("%FileName%") do @echo %%i>>"~%FileName%.tmp"
Move /Y "~%FileName%.tmp" "%FileName%"
а хотелось бы что-бы работало вот так »
Не выйдет. Ибо исходный файл будет очищен раньше, чем прочтён. Только через промежуточный временный файл.
megaloman, Спасибо вы решили мою проблему.
megaloman
13-08-2013, 23:59
Исключительно из упрямства предлагаю корявое решение без промежуточного файла с имитацией массива@Echo Off
Set "FileName=txt.txt"
SetLocal EnableExtensions EnableDelayedExpansion
Set /A N=0
FOR /F "tokens=1 usebackq delims= " %%i in ("%FileName%") do (
Set /A N=!N!+1
Set "String.!N!=%%i"
)
Del "%FileName%"
FOR /L %%j IN (1,1,%N%) DO Echo !String.%%j!>>"%FileName%"
Корявое, потому что:
1. Работает медленно
2. Не знаю, насколько длинным может быть выходной файл, то есть не знаю границ применимости по числу и длине строк
3. И намного длиннее чем решение Diskretor, приведённое ниже :closed-to:
Респект amel27 за идею
Dragokas
14-08-2013, 00:13
@echo off
SetLocal EnableExtensions
Set "FN=txt.txt"
For /F "delims= " %%? in ('type "%FN%"^& del "%FN%"') do echo %%?>>"%FN%"
:)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.