найти номер, заданный в текстовом файле, рандомизировать и вывести новый файл - PullRequest
1 голос
/ 17 апреля 2019

В пакетном файле это возможно?

Мне нужно иметь возможность идентифицировать, изменять и рандомизировать 2 числа (X,Y) в текстовом файле, чтобы все остальные числа оставались без изменений, а затем выводиться в новый файл.

Каждый набор начинается с числа 1, затем пробела или числа 2, затем пробела. Номера, которые я хочу изменить, начинаются после этого, затем цифры после того, как я не хочу их менять.

Пример набора:

2 315710.13 222342.17 570.00 0.0 0 1 1
2 316563.21 222546.17 570.00 0.0 0 1 1
2 315378.85 222092.42 570.00 0.0 0 1 1

Пример набора:

1 267976.30 237345.12 360.00 0.0 0 1 1
1 272779.45 239386.46 360.00 0.0 0 1 1
1 269837.52 239266.38 360.00 0.0 0 1 1

Пример изменения:

2 315710,13 222342,17 570,00 0,0 0 1 1

Номера примеров, которые я хочу изменить, выделены жирным шрифтом. Это 2 числа, которые я хочу изменить по всему файлу. Я хочу, чтобы эти числа были рандомизированы в пределах 1000 + или -. Только эти цифры я хочу изменить и вывести новый файл со всем остальным без изменений.

Фактические изменения:

27_Статическая техника. Артиллерия. Артиллерия $ Flak18_88mm 2 315710.13 222342.17 570.00 0.0 0 1 1

скопировано из файла симулятора.

1 Ответ

0 голосов
/ 19 апреля 2019
@echo off
setlocal

set "input=a.txt"
set "output=b.txt"

rem If defined, these sections will be modified.
set modify_sections="[NStationary]" "[Buildings]"

rem If defined, these sections will be ignored.
@rem Any section defined in modify_sections will not be ignored.
set ignore_sections="[MAIN]"

rem Loop through lines from input file and save modified lines to output.
set "section="
(
    for /f "usebackq delims=" %%_ in ("%input%") do (
        set "line=%%_"
        call :section
        if errorlevel 1 (
            call :ignore
            if errorlevel 1 (

                @rem Get 1st 3 tokens from the line.
                for /f "tokens=1-3* delims= " %%A in ("%%_") do (
                    set "a=%%A" & set "b=%%B" & set "c=%%C"

                    @rem Get tokens from the previous remainder.
                    for /f "tokens=1-4* delims=. " %%a in ("%%D") do (
                        set "d=%%a" & set "e=%%b" & set "f=%%c" & set "g=%%d" & set "h=%%e"
                        call :modify
                    )
                )
            )
        )
    )
) 3> "%output%"
exit /b 0


:ignore
setlocal enabledelayedexpansion

rem Preset ignore_section default.
if defined modify_sections (set "ignore_section=1") else set "ignore_section="

rem Check if ignore this section.
for %%A in (%ignore_sections%) do if /i "%section%" == "%%~A" set "ignore_section=1"

rem Check if modify this section.
for %%A in (%modify_sections%) do if /i "%section%" == "%%~A"  set "ignore_section="

if not defined ignore_section exit /b 1

rem Ignoring line.
>&3 echo !line!
exit /b 0


:section
setlocal enabledelayedexpansion

rem Check for section name.
if not "!line:~,1!" == "[" exit /b 1

rem Found section name %line%.
>&3 echo !line!
endlocal & set "section=%line%"
exit /b 0


:modify
setlocal enabledelayedexpansion

rem d,f add or minus random number from original number.
if !random:~-1! gtr 4 (set /a "d+=!random:~,3!") else set /a "d-=!random:~,3!"
if !random:~-1! gtr 4 (set /a "f+=!random:~,3!") else set /a "f-=!random:~,3!"

rem e,g replace with random number and pad with 0 if needed.
set "e=!random:~-2!" & if "!e:~1!" == "" set "e=0!e!"
set "g=!random:~-2!" & if "!g:~1!" == "" set "g=0!g!"

rem Modified output.
>&3 echo   !a! !b! !c! !d!.!e! !f!.!g! !h!
exit /b 0

Поскольку пакетный файл не может работать с числами с плавающей запятой, цикл for будет разделять точкой и пробелом, что составляет 4 числа из двух чисел с плавающей запятой.

На основе

27_Статическая техника. Артиллерия. Артиллерия $ Flak18_88mm 2 315710.13 222342.17 570.00 0,0 0 1 1

a.txt читается построчнои изначально не разделены.call :section проверит, обнаружено ли имя раздела из текущей строки, и будет сохранен в %section%, если истина, и строка будет немедленно передана в файл.

%%_ ограничен до:

  • a = %%A = 27_Static
  • b = %%B = vehicles.artillery.Artillery$Flak18_88mm
  • c = %%C = 2
  • * = %%D = 315710.13 222342.17 570.00 0.0 0 1 1

%%A до %%C - токены 1-3 и %%D - токен *, что является остатком.

%%D ограничивается:

  • d = %%a = 315710
  • e =%%b = 13
  • f = %%c = 222342
  • g = %%d = 17
  • h= %%e = 570.00 0.0 0 1 1

%%a до %%d - токены 1-4, а %%e - токен *, который является остатком.

for переменные установлены в статические переменные, т.е. set "a=%%A".

Все токены, кроме %%D, установлены на каждый из %a%-%h%.%d% и %f% имеют случайное число из 3 цифр, добавляемых или вычитаемых из каждой из них.%e% и %g% заменяются случайными числами из 2 случайных цифр.

Для обработки разделов во входном файле существуют переменные %modify_sections% и %ignore_sections%, поэтому модификацией можно управлять по разделам.Если оба не определены, то все разделы будут изменены.%modify_sections% имеет приоритет над %ignore_sections% и, следовательно, секции %modify_sections% всегда будут изменены.%ignore_sections% может быть полезно, если %modify_sections% не определено.

Каждая измененная строка выводится на %output%.Поток 3 используется для отображения эха в файл, что означает, что вы можете запустить скрипт с echo on или добавить эхо в метку :modify, :section или :ignore, которая будет выводиться на консоль, а не в выходной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...