2017-03-07 6 views
0

Je suis maintenant le plus gros problème je l'ai mentionné dans ce post ... Searching a text file and sending only numbers greater than a certain absolute value to text file?Comparez la valeur absolue d'un nombre dans une boucle for pour déterminer si elle doit être utilisée?

je me suis dit si je set num=!num:-=! avec une valeur initiale de, disons, -17, le !errorlevel! évaluerai true ou 0 droit? Quelque chose ne fonctionne pas ici ...

Pour clarifier, je dois filtrer seulement les premier et quatrième jetons de lignes dans lesquels le quatrième jeton est soit supérieur à 3 ou inférieur à -3, ainsi que toutes les lignes qui n'a pas de 4ème jeton (cette partie est résolue). J'ai essayé d'utiliser l'option /A de l'ensemble et il ne semble pas fonctionner encore.

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 

Le texte print.log ressemble:

KSDF 0 0 -4

as7d: S: asf 0 0 -4

kc: S: CD3 0 0 - 2

ASDK: s: s 0 0 6

la sd: S: dd 0 0

Répondre

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 
     ) 
    ) 

au lieu d'imprimer lorsque la valeur est inférieure à -3 ou supérieur à 3, il n'imprime pas lorsque la valeur est inférieure à 4 et supérieure à -4

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
      ^.................^ 
       don't print 
+0

J'aime vraiment cette approche. Élégant! Merci @MC ND! – Glycoversi

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

Ceci établit num que la valeur arithmétique des %%b. Notez que les variables d'environnement sont toujours. L'affectation effectue la conversion dans chaque sens selon les besoins. Votre mission aurait attribué une valeur de (par exemple) "-4" (y compris les guillemets)

La deuxième commande utilise la chaîne dans num et change tous - à *nothing* calculer d'où la valeur absolte en supposant qu'il est de la structure -number appropriée . Au-delà, je n'ai aucune idée de vos intentions de créer votre sortie, puisque vous n'avez pas indiqué quelle devrait être la sortie. De toute façon, errorlevel ne sera pas affectée par le set AFAIAA.

Notez que %%b contiendra toujours le numéro d'origine lu au point d'utilisation echo. Vous pouvez effectuer un if sur %%b ainsi que sur !num! - et utiliser %%b ou !num! dans votre echo au besoin.

Vous ne dites pas ce que votre entreprise gtr 3 est conçu pour faire ...


@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 

Vous devrez modifier le réglage de sourcedir en fonction de votre situation.

J'ai utilisé un fichier nommé q42639932.txt contenant vos données + extras pour mes tests.

Pour chaque ligne qui passe par le filtre findstr, si column4 est manquant, produire des astérisques fixés autre num à la valeur en %%b, et supprimer - quelconque de celle-ci. Si le nombre résultant est> 3, renvoyer l'original %%b autrement - bien, j'ai produit une ligne de rapport pour l'exhaustivité. De toute évidence, cela peut être rem.

+0

Tout comme un exercice académique, il est également possible d'obtenir la valeur absolue d'un nombre avec [opérations au niveau du bit] (http://stackoverflow.com/a/12041874/1683264). 'set/a" x = %% ~ b, masque = x >> 31, x = (x^masque) - masque "' – rojo

+0

@Magoo J'ai mis à jour mon message pour clarifier mes objectifs. Essentiellement, je veux juste saisir les jetons 1 et 4 de toutes les lignes qui ont une valeur inférieure à -3 ou supérieure à 3 dans le 4ème jeton et envoyer à un fichier. L'option/a ne semble pas le faire. – Glycoversi

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