Пакет — использование findstr для чтения записи файла и вывода, если она меньше переменной

Я пытаюсь прочитать текстовый файл, используя findstr для вывода только определенных символов в зависимости от того, меньше ли значение моего предопределенного числового значения. Вот строка из текстового файла, который я пытаюсь прочитать:

BW6556 *NULL* 1 6 1406922741 1407046596 1415081796 0 845292618 3 3 5 5 0 8 1024

BW6657 *NULL* 1 6 1408817016 1408817016 1416852216 0 193816666 2 2 5 5 0 0 1024

Мне нужно выражение, которое смотрит на строку выше и делает следующее:

  1. смотрит на длинное число в каждой строке, которая начинается с символа 41 и заканчивается символом 50
  2. Если это число БОЛЬШЕ 1 и МЕНЬШЕ моего номера переменной %expirydate%, тогда запишите символы 1-7 в новый файл.
  3. Делает то же самое в каждой строке текстового файла!

Есть идеи?


person user1313051    schedule 27.08.2014    source источник
comment
как насчет пробелов между числами? В запрашиваемом номере будет пробел...   -  person npocmaka    schedule 09.09.2014
comment
Каким максимальным значением может быть это число? Есть ли буквальные нули в строках/   -  person foxidrive    schedule 09.09.2014


Ответы (3)


Это невозможно сделать с помощью FINDSTR. Во-первых, FINDSTR не может численно сравнивать числа. Во-вторых, FINDSTR не может вернуть подстроку из строки.

Это можно решить, используя FOR /F для анализа списка значений, разделенных пробелами. Обратите внимание, что это решение не основано на позиции символа.

РЕДАКТИРОВАТЬ: значительно переписать, чтобы учесть возможность числа больше 2 147483647. Кроме того, мой исходный код не работал, если в середине числа были нули

Это решение предполагает, что все строки имеют 10 цифр в 7-м токене (позиция 41). Я заключаю значения в кавычки в рамках сравнения IF, чтобы заставить его выполнять текстовое сравнение вместо числового сравнения. Это будет работать правильно, если все значения имеют ровно 10 цифр.

set "num=0000000000%expirydate%"
set "num=%num:~-10%"
for /f "usebackq tokens=1,7" %%A in ("test.txt") do (
  if "%%C" gtr "0000000001" if "%%C" lss "%expirydate%" (echo %%A )
)
person dbenham    schedule 27.08.2014

Если я посмотрю на ваш пример и возьму символы с 41 по 50 из первой строки, это даст мне: «141508179», но эта строка имеет длину десять символов; "1415081796" и это не похоже на дату.

Здесь у вас есть VBScript, который извлекает числа больше 200000000 и помещает их в новый файл.

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Temp\input.txt", ForReading)   
Do While objFile.AtEndOfStream <> True
    strLine = objFile.ReadLine
    extractednr = Mid(strLine,41,9)
    If (extractednr > 200000000) Then
        strContents = strContents & extractednr & vbCrLf
    End If
Loop
objFile.Close

Set objFile = objFSO.CreateTextFile("C:\Temp\output.txt", true)
objFile.WriteLine strContents
objFile.Close
person Kokkie    schedule 27.08.2014
comment
Спасибо за это, но я действительно не понимаю сценарий VB, поэтому не могу манипулировать этим :( Мне действительно нужен сценарий, чтобы проверить, больше ли числа между символами 41-51, чем моя переменная %expirydate%, и если да, то для вывода первых 7 символов этой строки в новый файл. - person user1313051; 09.09.2014

Есть много вопросов.. Вы хотите, чтобы количество пробелов ДО или ПОСЛЕ было очищено? Вы уверены, что это точные конечные и начальные символы? Каким может быть максимальное значение чисел? Может ли оно быть больше 2147483647 - максимальное целочисленное значение? Если да - может ли вместо этого выполняться сравнение строк?

@echo off

set /a variable=2147483647
set "val_file=number.txt"
set "new_file=new.txt"

break>"%new_file%"
setlocal enableDelayedExpansion
for /f "useback delims=" %%# in ("%val_file%") do (
    set "line=%%#"
    set line=!line:~40,10!
    set /a number=!line: =!
    rem echo !number! !variable!
    if !number! GTR 1 if !number! LSS !variable! (echo(!number!)>>"%new_file%"

)
person npocmaka    schedule 09.09.2014
comment
В приведенном выше примере число, которое я также хочу сделать для сравнения: 1415081796 Да, это точные начальные и конечные символы. Максимальное значение чисел будет 9999999999. Не уверены, можно ли выполнить сравнение строк? если это имеет дело с числами, то да, я полагаю... :S - person user1313051; 09.09.2014