PDA

Показать полную графическую версию : Сравнение чисел в .txt и двух текстовых файлов


papacoca
11-02-2019, 17:14
Есть текстовый файл 1.txt в котором записаны 2 числа (число 1 и число 2) в один ряд через пробел, берем за пример: 31 5
1) Если хоть одного из числа 1 и числа 2 нет в перечне: 2, 5, 7, 15, 17, 19, 23, 31, 35 то выполнить скрипт заново.
2) Если число 1 и число 2 есть в списке чисел то выполнить скрипт далее.
3) Переименовать 1.txt в 2.txt.
4) Новый созданный 1.txt сравнить с 2.txt - 1 число с 1 числом и 2 число с 2 числом, если хоть одно различие то выполнить скрипт далее.

Iska
11-02-2019, 20:50
Это что за лабораторка дурная такая?!

papacoca
11-02-2019, 21:15
Та нет, это для другого...

Iska
11-02-2019, 21:17
Тогда опишите саму задачу, а не выбранное решение.

YuS_2
11-02-2019, 21:33
papacoca, вот решение, на Ваш алгоритм:
@echo off
set "file1=1.txt"
set "file2=2.txt"
set "var=2 5 7 15 17 19 23 31 35"

:begin
echo.Проверяем числа
set /a f1=0,f2=0
if not exist "%file1%" (echo.Такого файла [%file1%], не существует&pause&exit /b)
<1.txt (for /f "tokens=1,2" %%a in ('more') do (
echo.%%a|>nul findstr "%var%"&&set /a f1=1
echo.%%b|>nul findstr "%var%"&&set /a f2=1
)
)
if %f1% equ 1 (
if %f2% equ 1 (goto next) else (
echo Возвращаемся в начало до посинения, пока в файле не появятся обе цифры
pause&goto begin
)
) else (
echo Возвращаемся в начало до посинения, пока в файле не появятся обе цифры
pause&goto begin
)
pause&echo Error&exit /b

:next
echo.
echo.Есть оба числа, поехали дальше выполнять
timeout /t 5
echo.Выполнили
echo.
echo Переименовываем [%file1%] В [%file2%]
if not exist "%file2%" (ren "%file1%" "%file2%") else (
echo.Файл [%file2%] уже существует. Требуется принятие решения. Выходим.
pause&exit /b
)

:wait
if not exist "%file1%" (echo.Ожидаем создания [%file1%]&timeout /t 5&echo.&goto wait)
>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная".
pause
:)

papacoca
11-02-2019, 22:35
вот решение, на Ваш алгоритм: »

Благодарю за проделанную работу, спасибо.

Одно уточнение!
В 3) пункте: Пишет, Переименовываем [1.txt] в [2.txt] Файл [2.txt] уже существует.
Не может переименовать [1.txt] в [2.txt] потому что он существует.

Можно сделать, чтоб без лишних запросов, удалить 2.txt и переименовать 1.txt в 2.txt, автоматом нужно?
Так как 2.txt будет постоянно создан его нужно удалить перед тем как переименовать 1.txt

YuS_2
11-02-2019, 23:07
Не может переименовать [1.txt] в [2.txt] потому что он существует. »
Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию :)

Можно сделать, чтоб без лишних запросов, удалить 2.txt и переименовать 1.txt в 2.txt, автоматом нужно? »
Можно, конечно, но попытайтесь это сделать самостоятельно, это несложно.
Подсказка:
Редактировать надо вот этот условный блок:
if not exist "%file2%" (ren "%file1%" "%file2%") else (
echo.Файл [%file2%] уже существует. Требуется принятие решения. Выходим.
pause&exit /b
)
надо заменить проверку на существование файла с ложного, на истинный и добавить перед переименованием команду удаления файла...
Либо, вместо добавления команды удаления, можно просто заменить команду переименования на команду перемещения - move с ключом /y, а условный блок вообще убрать, оставить только одну команду move
В помощь:
if /?
move /?
del /?
ren /?
pause /?
exit ?

papacoca
11-02-2019, 23:27
Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию »
Совершенно точно, сделаю.

Можете немного пояснить, если файлы идентичны вместо этого прописать 1 сценарий? (echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)
Если файлы отличаются то нужно прописывать после этого 2 сценарий? echo.Приехали! Станция "Конечная".

>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b)
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная".

YuS_2
11-02-2019, 23:46
если файлы идентичны вместо этого прописать 1 сценарий? »
(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b) »
Да, здесь можно прописать доп.сценарий, либо организовать переход на метку, которую поместить надо после строк сценария, который должен выполняться при различных файлах.
Т.е. примерно так:
...
>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны&goto next2)
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная".
pause&exit /b

:next2
echo.здесь выполняем код, если файлы одинаковые.
pause&exit /b

Если файлы отличаются то нужно прописывать после этого 2 сценарий? »
Вместо этих двух строк:
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная". »
можно писать какой угодно сценарий...

alpap
12-02-2019, 12:26
Тогда опишите саму задачу, а не выбранное решение. »
papacoca, очень веское замечание и даже пытаясь выполнить требуемое, натыкаешься или на недомолвку или несоответствие. Запускать похоже надо планировщиком и желательно по контролю появления "1.txt". В моем коде он всегда удаляется для освобождения места для нового и если echo (предохранитель) в if-ах не убирать, то видны все варианты при разных сочетаниях соответствия файлов и перечня. Да, еще, для сравнения фалов использовал ту же методику что и с перечнем на тот случай если в файле "1.txt" будет строка: 31 5, а в файле "2.txt" будет строка: 5 31, то в моем случае такие файлы будут считаться равными по содержанию (fc выдаст ошибку по errorlevel), если такого быть не может или это должно быть отличием, то fc использовать допустимо.

@echo off
set "f1=1.txt"
set "f2=2.txt"
set "pr=2, 5, 7, 15, 17, 19, 23, 31, 35"

if not exist "%f1%" (echo No "%f1%"& pause& exit) else (<"%f1%" set /p z1=)
if exist "%f2%" <"%f2%" set /p z2=
for %%a in (%z2%) do echo %%a|>nul findstr "%z1%" || set x2=%%a
for %%a in (%z1%) do echo %%a|>nul findstr "%pr:,=%" || set x1=%%a
if not defined x2 (
echo Отличий в файлах нет, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
) else (
if not defined x1 (
echo Оба числа есть в перечне, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
) else (
echo Одного или двух чисел нет в перечне, удаляем "%f2%" и переименовываем "%f1%" в "%f2%"& echo del "%f2%"& echo ren "%f1%" "%f2%"
)
)
pause

megaloman
12-02-2019, 16:36
@Echo Off
Cls
Set "FileIn=Z:\Soft_In\1.txt"
Set "FileOut=Z:\Soft_In\2.txt"

Set "Reestr=2, 5, 7, 15, 17, 19, 23, 31, 35"
Set /A Tsec=10

Set "SR=="
For %%i In (%Reestr%) Do Call Set "SR=%%SR%%%%i="
:Begin1
Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin1

3<"%FileIn%" (Set /p SIn=<&3)
Call :Found "%SIn%" "%SR%" %Tsec% ||GoTo :Begin1

>nul Move /Y "%FileIn%" "%FileOut%"
Set "SInNew=%SIn%"
:Begin2
Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin2

3<"%FileIn%" (Set /p SInNew=<&3)

If "%SInNew%"=="%SIn%" Echo +++ Файлы "%FileIn%" "%FileOut%" одинаковые. Что дальше - не знаю :) &Pause &Exit /b 0
If Not "%SInNew%"=="%SIn%" Echo --- Файлы "%FileIn%" "%FileOut%" разные. Что дальше - не знаю :) &Pause &Exit /b 1
GoTo :Eof

:NoFile
If Not Exist %1 (
Echo --- Нет файла %1
Timeout /T %~2
Exit /B 1 &Rem Файла нет
)
Exit /B 0

:Found
For %%i In (%~1) Do >Nul (Echo %~2|Find "=%%i=")||(
Echo --- Нет %%i в реестре значений
Timeout /T %~3
Exit /B 1 &Rem Что-то не найдено в реестре значений
)
Exit /B 0Заменить выделенный кусок предыдущего кода :Begin2
Call :NoFile "%FileIn%" %Tsec% ||GoTo :Begin2
Set "SRnew=="
For %%i In (%SIn%) Do Call Set "SRnew=%%SRnew%%%%i="

3<"%FileIn%" (Set /p SInNew=<&3)
Call :Found "%SInNew%" "%SRnew%" 0

If "%ErrorLevel%"=="0" Echo +++ В файлах "%FileIn%" "%FileOut%" одинаковые числа. Что дальше - не знаю :) &Pause &Exit /b 0
If Not "%ErrorLevel%"=="0" Echo --- В файлах "%FileIn%" "%FileOut%" числа отличаются. Что дальше - не знаю :) &Pause &Exit /b 1
Я сделал таймаут (у меня 10 сек) для ожидания 1 файла, если его нет или если значения не содержатся в реестре.

papacoca
12-02-2019, 19:10
set "var=" »
Возникла проблемка с этим набором цифр.

set "var=1 4 6 14 16 20 24 32 39"
Если в 1.txt число 1 и число 2 = 1 15, пишет: Есть оба числа, поехали дальше выполнять, а в действительности 15 нету.

Для этого набора все четко работает:
set "var=2 5 7 15 17 19 23 31 35"

YuS_2
12-02-2019, 20:09
Возникла проблемка »
Да, это я не продумал...
Для этого набора все четко работает: »
Боюсь, что тоже не четко... можно проверить, два числа 2 и 25, например...
В общем, надо менять механизм проверки.
@echo off
set "file1=1.txt"
set "file2=2.txt"
set "var=2 5 7 15 17 19 23 31 35"

:begin
cls
echo.Проверяем числа
set /a f1=0,f2=0
if not exist "%file1%" (echo.Такого файла [%file1%], не существует&pause&exit /b)
<1.txt (for /f "tokens=1,2" %%a in ('more') do (
for %%i in (%var%) do (
if [%%a] equ [%%i] (set /a f1=1)
if [%%b] equ [%%i] (set /a f2=1)
)
)
)
if %f1% equ 1 (
if %f2% equ 1 (goto next) else (
echo Возвращаемся в начало до посинения, пока в файле не появятся обе цифры
timeout /t 3
goto begin
)
) else (
echo Возвращаемся в начало до посинения, пока в файле не появятся обе цифры
timeout /t 3
goto begin
)
pause&echo Error&exit /b

:next
echo.
echo.Есть оба числа, поехали дальше выполнять
timeout /t 5
echo.Выполнили
echo.
echo Переименовываем [%file1%] В [%file2%]
move /y "%file1%" "%file2%"

:wait
if not exist "%file1%" (echo.Ожидаем создания [%file1%]&timeout /t 5&echo.&goto wait)
>nul fc "%file1%" "%file2%"&&(echo.Файлы идентичны&goto next2)
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная".
pause&exit /b

:next2
echo.здесь выполняем код, если файлы одинаковые.
pause&exit /b

papacoca
28-02-2019, 19:54
В общем, надо менять механизм проверки. »

Скрипт работает хорошо! Но есть такой баг не в скрипте а в файле file1=1.txt который создается автоматически, бывает он пустой или с иероглифами типа @ #
Можете подсказать: чтобы скрипт дополнительно проверял file1=1.txt, если он пустой или содержит @ # эти символы то выполнял заново.
Если можно в пару строк:))

YuS_2
01-03-2019, 08:00
если он пустой или содержит @ # эти символы то выполнял заново.
Если можно в пару строк »
Можно даже короче :)
надо заменить квадратные скобки на кавычки в условных проверках, т.е. вот эти две строки:
if [%%a] equ [%%i] (set /a f1=1)
if [%%b] equ [%%i] (set /a f2=1)

должны стать таким:
if "%%a" equ "%%i" (set /a f1=1)
if "%%b" equ "%%i" (set /a f2=1)

и всё.

PS Хотя он и с квадратными скобками должен в начало переходить и работать по кругу, пока цифры не появятся...
А у Вас что происходило?




© OSzone.net 2001-2012