Манипуляции с результатами Findstr и пакетный файл цикла

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

  1. Найдите VALUE1 в файле, если строка содержит ключевое слово "word1" и отобразите VALUE1.
  2. Найдите VALUE2 в файле, если строка содержит ключевое слово "word1".
  3. Найдите VALUE3 в файле, если строка содержит ключевое слово "word2" (я также знаю, что это значение будет в отдельной строке).
  4. Добавьте VALUE2 и VALUE3 и отобразите это значение как ВСЕГО.
  5. Повторно просматривайте файл, выполнив шаги 1–4, и отобразите еще ИТОГО, если есть другой набор VALUE1, VALUE2 и VALUE3.

Файл примера (test.txt):

Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches 
Hello today is 05032017 and you have 5 apples 
Also it is good to know that you bought 6 peaches

Ключевые слова: "яблоки", "персики"

Желаемый результат:

  First value is: 05022017 
  Second value is: 4 
  Third value is: 5 
  TOTAL: 9
  First value is: 05032017 
  Second value is: 5 
  Third value is: 6 
  TOTAL: 11

Текущий код:

@echo off

FOR /f "tokens=4,8" %%a in ('type test.txt ^|findstr /i "apples"') do (

   echo(First value is: %%a

   echo(Second value is: %%b

)

FOR /f "tokens=10" %%c in ('type test.txt ^|findstr /i "peaches"') do (

   echo(Value on another line is: %%c

)

echo(All done!

echo(&pause&goto:eof

Токовый выход:

First value is: 05022017
Second value is: 4
First value is: 05032017
Second value is: 5
Value on another line is: 5
Value on another line is: 6

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

Я хочу иметь возможность запустить этот сценарий для файла с N возможностями, что означает, что он должен работать в обеих этих ситуациях:

Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches

Или же

Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches 
Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches 
Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches 
Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches 
Hello today is 05022017 and you have 4 apples 
Also it is good to know that you bought 5 peaches

Я был бы очень признателен за любую помощь, которую я могу получить, или за некоторые советы о том, как я могу подойти к этому по-другому.

Спасибо!

ОБНОВЛЕНИЕ Рабочий код:

SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=I:\Tests"
SET "filename1=%sourcedir%\test.txt"
SET "word1=apples"
SET "word2=peaches"

FOR /f "tokens=4,8,9,10,11 delims= " %%a IN ('findstr "%word1% %word2%" "%filename1%"') DO (
 IF /i "%%~c"=="%word1%" (
 REM apple line
  ECHO First value is: %%a
  ECHO Second value is: %%b
  SET /a value2=%%b
 )
 IF /i "%%~e"=="%word2%" (
 REM peaches line
  ECHO Third value is: %%d
  SET /a total=value2 + %%d
  ECHO Total: !total!
 )
)

GOTO :EOF

1 ответ

Решение
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q44875889.txt"
SET "word1=%~1"
SET "word2=%~2"

FOR /f "tokens=4,8,9,10,11delims= " %%a IN ('findstr /Li /c:"%word1%" /c:"%word2%" "%filename1%"') DO (
 IF /i "%%~c"=="%word1%" (
 REM apple line
  ECHO First value is: %%a
  ECHO Second value is: %%b
  SET /a value2=%%b
 )
 IF /i "%%~e"=="%word2%" (
 REM peaches line
  ECHO Third value is: %%d
  SET /a total=value2 + %%d
  ECHO Total: !total!
 )
)

GOTO :EOF

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

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

Намного лучше предоставить нам реалистичные данные.

Обработка должна быть очевидной - читать каждую строку вывода findstr который ищет любое из слов и выбирает соответствующие токены.

Если первое слово появляется в требуемой позиции, обработайте его и сохраните требуемое value2, То же самое второе слово, вычисление итога и использование delayed expansion показать значение времени выполнения total

Не имеет смысла пытаться обрабатывать строки, которые не имеют требуемого формата.


Важные (но изначально пропущенные) инструкции по выполнению:

беги как

thisbatchname яблоки персики

Два предоставленных слова заменяют word1/2 в моей первоначальной публикации.

(и так как параметры не были предоставлены, word1/2 были пустыми, следовательно, сообщение об ошибке) введите описание изображения здесь

Другие вопросы по тегам