Использование командного файла для поиска текста в файле, затем его очистка, сохранение в файл и переменную

Хорошо, я искал и искал в течение нескольких дней и не могу найти все, что работает. Если я что-то пропустил, мне очень жаль.

Моя проблема: у меня есть текстовый файл с исходным кодом с веб-страницы. Моя цель - найти текстовый файл и найти. "ниже линии вокруг того, что я хочу"

<b>public</b>
</a>
</td>
<td></td>
<td class="b">
705330
</td>
<tr>
<tr>
<td>

(есть намного больше исходного кода с другими номерами вроде того же самого, но публика уникальна. Ниже уникальны (не числа) прямо сейчас, но я думал, что чем больше совпадений, тем лучше)

<td class="b">
705330
</td>

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

Как сравнивать новый (переменную) со старым.txt и делать что-то.

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

Я ценю любую помощь, заранее спасибо

1 ответ

Решение

Хорошо, это довольно сложно...

В пакетном режиме большинство приложений довольно жесткие, поэтому работа с такими очень гибкими текстовыми (HTML) файлами является сложной задачей; Я попробовал это хотя...

Пакетный скрипт, следующий ниже, предполагает, что:

  • один (текстовый) файл задается в качестве аргумента командной строки;
  • поле "public" действительно уникально (это не будет проверено);
  • поле "public" и токен "class=" чувствительны к регистру;
  • после поля "public" всегда появляется токен "class=";
  • интересующий номер появляется где-то после токена "class=" (необязательно сразу после);
  • количество процентов указано в отдельной строке;

Итак, поехали (объяснение в комментариях):

@echo off
setlocal EnableDelayedExpansion

rem set constant holding exact appearance of "public" field;
rem ^ escapes < and > which would otherwise constitute (unintended) redirections
set PUBLIC_TAG=^<b^>public^</b^>
rem set constant holding exact appearance of "class" token
set CLASS_PROP=class=
rem set constant to non-empty value if you want the target value to be right after the "class" token
set CLASS_GLUE=

rem initialise variable that holds line number of "public" field
set LinePublic=0
rem clear variable that is set as soon as "class" token is found
set FoundClass=
rem clear variable that will hold resulting (numeric) target value
set FieldValue=

rem check for command line argument being given
if "%1"=="" (echo No file given^^!& exit /B)

rem search for unique "public" field, return found line, prefix with line number;
rem the `2> nul` portion avoids displaying any `findstr` errors in case of input lines > 8192 chars.;
rem wrapped-around `for /F` retrieves line number only, stored in %LinePublic%
for /F "delims=:" %%L in ('type "%~1" ^| findstr /N /L "%PUBLIC_TAG%" 2^> nul') do set LinePublic=%%L
rem if no "public" field found, terminate batch script
if %LinePublic% equ 0 (echo File does not contain field "%PUBLIC_TAG%"^^!& exit /B)
rem starting at line number %LinePublic%, go through each line
for /F "usebackq skip=%LinePublic% delims=" %%F in ("%~1") do (
rem check if %FoundClass% has been set in (one of the) previous `for` iteration(s)
if defined FoundClass (
rem "class" token found previously, so check if target value has already been found
if not defined FieldValue (
rem no target value available yet, so check if current line contains decimal digits only
echo."%%F" | findstr /R "^\"[0-9][0-9]*\" \$" > nul
rem if ErrorLevel is 0 (below 1), current line constitutes one numeric value, so store it;
rem the `call` statement is necessary to avoid syntax errors due to < and > in line text %%F
if not ErrorLevel 1 ((call set FieldValue=%%F) & goto :FINE) else (
rem if you want the target value to be right after the "class" token, %CLASS_GLUE% must be set:
if defined CLASS_GLUE (echo No number follows "%CLASS_PROP%" token^^!& exit /B)
)))
rem search current line for "class" token; ErrorLevel is 0 if found
echo."%%F" | findstr /L "%CLASS_PROP%" > nul
rem if ErrorLevel is below 1, indicate by setting %FoundClass%, checked in next `for` iteration
if not ErrorLevel 1 set FoundClass=True
) & rem next %%F
:FINE
rem this compound statement makes %FieldValue% to survive `setlocal`/`endlocal` block
endlocal & set FieldValue=%FieldValue%
echo.%FieldValue%

Это работает по крайней мере для вашего образца текстового файла...

Подсказка: если вы хотите, чтобы числовое значение ожидалось сразу после токена "class=", установите переменную (константу) CLASS_GLUE в коде любое допустимое непустое значение.

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

above_batch_script_name.bat input_html_text_file.txt > output_text_file.txt

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

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