Манипуляции с результатами Findstr и пакетный файл цикла
Я работаю над сценарием, который собирает значения из файла, которые находятся в строке текста, и я нахожу эти значения с помощью findstr со ссылкой на ключевое слово. Процесс, который я хочу выполнить, заключается в следующем:
- Найдите VALUE1 в файле, если строка содержит ключевое слово "word1" и отобразите VALUE1.
- Найдите VALUE2 в файле, если строка содержит ключевое слово "word1".
- Найдите VALUE3 в файле, если строка содержит ключевое слово "word2" (я также знаю, что это значение будет в отдельной строке).
- Добавьте VALUE2 и VALUE3 и отобразите это значение как ВСЕГО.
- Повторно просматривайте файл, выполнив шаги 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 были пустыми, следовательно, сообщение об ошибке)