Войти

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


root221
12-08-2013, 15:09
Здравствуйте,

Помогите удалить всё до первого проблела


qwerty - tgbvfrw
asdfg - hjkl
zxcvbnm - aaaa
asdfghjjj - ssssssss
rtyuiopp - zcdsc
ghjklhgg - saffdsfsd
qaswefg - htyytjytj

В общем надо что бы после запуска вашего скрипта, в текстовом файле оставалось только.

qwerty
asdfg
zxcvbnm
asdfghjjj
rtyuiopp
ghjklhgg
qaswefg


Спасибо за ранее!!

Iska
12-08-2013, 15:48
удалить всё до первого проблела »
Может быть, после первого пробела, включительно?

@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 ==========================================================================

root221
12-08-2013, 20:38
Может быть, после первого пробела, включительно? »
да) вы правы я просто торопился.

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

фигню наверно я сделал но оно работает =)

Iska
13-08-2013, 04:53
не ожидал что будет такой большой »
Вы ведь написали:
в текстовом файле оставалось только »
т.е. — в том же файле.

Если усечённые строки сохранять в новый файл — надобность в промежуточном временном файде отпадает (не проверялось):
@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 …»
Зачем Вам второй токен? Вы его не пользуете.

root221
13-08-2013, 17:47
Смотрите как работает мой скрипт,

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
)

Просто если так сделать то он записывает только последнюю строчку из наиденного

root221
13-08-2013, 18:27
в общем добился я того что мне надо, пока-что вот так

@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%"

Iska
13-08-2013, 19:20
а хотелось бы что-бы работало вот так »
Не выйдет. Ибо исходный файл будет очищен раньше, чем прочтён. Только через промежуточный временный файл.

root221
13-08-2013, 22:19
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