Сравните абсолютное значение числа в цикле for, чтобы определить, следует ли его использовать?

Теперь я столкнулся с более серьезной проблемой, о которой я упоминал в этом сообщении... Поиск в текстовом файле и отправка в текстовый файл только чисел, превышающих определенное абсолютное значение?

Я подумал, что если я set num=!num:-=! с исходным значением, скажем, -17, то !errorlevel! будет оцениваться как true или 0 правильно? Хотя что-то здесь не работает...

Для уточнения мне нужно отфильтровать только первые и четвертые токены строк, в которых четвертый токен либо больше 3, либо меньше -3, а также любые строки, в которых нет 4-го токена (эта часть решена) . Я попытался использовать параметр set /A, но он все еще не работает.

setlocal enabledelayedexpansion

set "min=-"

for /f "tokens=1,4" %%a in ('findstr /b /r /c:"[^ ]*:S:" print.log') do (
    if %%b=="" (echo %%a ^*^*^* >>new.txt) else (
        set num="%%b"
        set num=!num:-=!
        if !errorlevel!==0 (
            if !num! GTR 3 echo %%a !min!!num! >> new.txt
        ) else (
            if !num! GTR 3 echo %%a !num! >> new.txt
        )
    )
)

exit /b

Текст в print.log выглядит так:

ксдф 0 0 -4

as7d:S:asf 0 0 -4

kc:S:cd3 0 0 -2

asdk:S:s 0 0 6

лад:S:дд 0 0


person Glycoversi    schedule 07.03.2017    source источник


Ответы (2)


@echo off
    setlocal enableextensions disabledelayedexpansion

    >"new.txt" (
        for /f "tokens=1,4" %%a in ('
            findstr /b /r /c:"[^ ]*:S:" print.log
        ') do if "%%~b"=="" (echo %%a ***) else (
            set "print=1" 
            if %%b lss 4 if %%b gtr -4 set "print="
            if defined print echo %%a %%b
        )
    )

Вместо печати, когда значение меньше -3 ИЛИ больше 3, оно не печатается, когда значение меньше 4 И больше -4

-6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6
          ^.................^
              don't print
person MC ND    schedule 07.03.2017
comment
Мне очень нравится этот подход. Элегантный! Спасибо @MC ND! - person Glycoversi; 09.03.2017

set /A num=%%b
set num=!num:-=!

Это устанавливает num как арифметическое значение %%b. Обратите внимание, что переменные среды всегда являются строками. Присваивание выполняет преобразование в каждом направлении по мере необходимости. Ваше задание присвоило бы значение (например) "-4" (включая кавычки)

Вторая команда использует строку в num и изменяет все - на *nothing*, таким образом, вычисляя абсолютное значение, предполагая, что оно имеет соответствующую структуру -number.

Кроме того, я понятия не имею, каковы ваши намерения создать свой вывод, поскольку вы не указали, каким должен быть вывод. В любом случае, errorlevel не будет затронута set AFAIAA.

Обратите внимание, что %%b по-прежнему будет содержать исходное число, считанное в момент использования echo. Вы можете выполнить if на %%b, а также на !num! и использовать %%b или !num! в своем echo по мере необходимости.

Вы не говорите, для чего предназначен ваш gtr 3 бизнес...


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q42639932.txt"
FOR /f "tokens=1,4" %%a IN ('findstr /b /r /c:"[^ ]*:S:" "%filename1%"') DO (
 if "%%b"=="" (echo %%a ^*^*^*) else (
  set num=%%b
  set num=!num:-=!
  if !num! GTR 3 (echo %%a %%b 
  ) else (
  ECHO just FOR demo %%a %%b
  )
 )
)

GOTO :EOF

Вам нужно будет изменить настройку sourcedir в соответствии с вашими обстоятельствами.

Я использовал файл с именем q42639932.txt, содержащий ваши данные + дополнения для тестирования.

Для каждой строки, которая проходит фильтр findstr, если столбец 4 отсутствует, создайте звездочки, иначе установите num на значение в %%b и удалите из него все -. Если результирующее число > 3, вывести исходное %%b, в противном случае - что ж, я создал строку отчета для полноты. Очевидно, что это можно remмедлить.

person Magoo    schedule 07.03.2017
comment
В качестве академического упражнения также можно получить абсолютное значение числа с помощью побитовых операций. set /a "x = %%~b, mask = x >> 31, x = (x ^ mask) - mask" - person rojo; 07.03.2017
comment
@Magoo Ive обновил свой пост, чтобы прояснить свои цели. По сути, я хочу просто взять токены 1 и 4 из всех строк, которые имеют значение меньше -3 или больше 3 в 4-м токене, и отправить в файл. Параметр /a, похоже, этого не делает. - person Glycoversi; 07.03.2017