Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сравнение чисел в .txt и двух текстовых файлов (http://forum.oszone.net/showthread.php?t=339176)

papacoca 11-02-2019 17:14 2857337

Сравнение чисел в .txt и двух текстовых файлов
 
Вложений: 1
Есть текстовый файл 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 2857370

Это что за лабораторка дурная такая?!

papacoca 11-02-2019 21:15 2857374

Та нет, это для другого...

Iska 11-02-2019 21:17 2857375

Тогда опишите саму задачу, а не выбранное решение.

YuS_2 11-02-2019 21:33 2857381

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 2857393

Цитата:

Цитата YuS_2
вот решение, на Ваш алгоритм: »

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

Одно уточнение!
В 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 2857397

Цитата:

Цитата papacoca
Не может переименовать [1.txt] в [2.txt] потому что он существует. »

Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию :)

Цитата:

Цитата papacoca
Можно сделать, чтоб без лишних запросов, удалить 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 2857399

Цитата:

Цитата YuS_2
Ну, так в Вашем алгоритме и нет никаких условий на такую ситуацию »

Совершенно точно, сделаю.

Можете немного пояснить, если файлы идентичны вместо этого прописать 1 сценарий?
Код:

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

echo.Приехали! Станция "Конечная".
Цитата:

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

YuS_2 11-02-2019 23:46 2857402

Цитата:

Цитата papacoca
если файлы идентичны вместо этого прописать 1 сценарий? »

Цитата:

Цитата YuS_2
(echo.Файлы идентичны. Что будем делать дальше - не знаю :^)&pause&exit /b) »

Да, здесь можно прописать доп.сценарий, либо организовать переход на метку, которую поместить надо после строк сценария, который должен выполняться при различных файлах.
Т.е. примерно так:
Код:

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

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

Цитата:

Цитата papacoca
Если файлы отличаются то нужно прописывать после этого 2 сценарий? »

Вместо этих двух строк:
Цитата:

Цитата YuS_2
echo.Файлы отличаются, поехали дальше...
echo.Приехали! Станция "Конечная". »

можно писать какой угодно сценарий...

alpap 12-02-2019 12:26 2857479

Цитата:

Цитата Iska
Тогда опишите саму задачу, а не выбранное решение. »

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 2857518

Если надо идентичность файлов
Код:

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

Цитата:

Цитата YuS_2
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 2857549

Цитата:

Цитата papacoca
Возникла проблемка »

Да, это я не продумал...
Цитата:

Цитата papacoca
Для этого набора все четко работает: »

Боюсь, что тоже не четко... можно проверить, два числа 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 2860619

Цитата:

Цитата YuS_2
В общем, надо менять механизм проверки. »

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

YuS_2 01-03-2019 08:00 2860653

Цитата:

Цитата papacoca
если он пустой или содержит @ # эти символы то выполнял заново.
Если можно в пару строк »

Можно даже короче :)
надо заменить квадратные скобки на кавычки в условных проверках, т.е. вот эти две строки:
Код:

                        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 Хотя он и с квадратными скобками должен в начало переходить и работать по кругу, пока цифры не появятся...
А у Вас что происходило?


Время: 15:59.

Время: 15:59.
© OSzone.net 2001-