
В настоящее время я пытаюсь написать пакетный скрипт, и на этом этапе мне нужно найти строку «null» и определить, сколько раз она отображается в файле.
Я загружаю API с веб-сайта каждый раз, когда запускается скрипт, и в их API время от времени появляется "null". Когда их API загружается, он загружается в одну строку, и я пробовал это:
findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt
Но здесь отображается только «1», поскольку файл состоит всего из 1 строки.
Есть ли другой способ вывести количество раз, когда в файле встречается «null»?
добавлено пользователем barlop
Автор статьи только что упомянул, что не может устанавливать стороннее программное обеспечение.
решение1
Я должен верить, что это уже спрашивалось и на это уже отвечали. Но вот простой пакетный скрипт, который может выполнить эту работу.
::StringCount String File
::
:: Count the number of times that String appears in File.
:: The search is not case sensitive.
:: Enclosing quotes are not considered to be part of the string.
:: The string cannot contain =
::
@echo off
setlocal disableDelayedExpansion
set count=0
for /f usebackq^ delims^=^ eol^= %%A in (%2) do set "ln=%%A"&call :testLine %1
echo %count%
exit /b
:testLine
setlocal enableDelayedExpansion
:testLine2
if defined ln if "!ln:*%~1=!" neq "!ln!" (
set /a count+=1
set "ln=!ln:*%~1=!"
goto testLine2
)
endlocal & set /a count=%count%
exit /b
Использование командной строки будет
StringCount null yourFile.txt
При работе с большими файлами это может быть довольно медленно.
Я написалгибридная JScript/пакетная утилита под названием REPL.BATэто может облегчить работу и должно быть довольно быстрым. Утилита выполняет поиск и замену регулярных выражений в строках, считываемых из stdin, и записывает результат в stdout. У нее есть довольно много опций, включая опции, упрощающие эту задачу. Утилита представляет собой чистый скрипт, который будет работать на любой современной машине Windows, начиная с XP. Полная документация встроена в скрипт.
Вот как это можно использовать для решения вашей проблемы, предполагая, что поискс учетом регистра.
<yourFile.txt repl (null) \n$1\n ax | find /c "null"
Если вы хотите, чтобы поиск былбез учета регистра
<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"
решение2
Есть ли у вас возможность загрузить один исполняемый файл?
Вам нужна хорошо портированная grep
утилита,
например grep (GNU grep) 2.16
Вам нужен вариант -c
или --count
.
Согласно комментарию @dbenham ниже, способ подсчета не только строк со значением «null», но и нескольких экземпляров В КАЖДОЙ СТРОКЕ следующий:
grep -o null файл-для-чтения.txt | grep -c
решение3
Это не очень пуристский подход. Он требует, чтобы вы получили gnuwin32 с пакетами coreutils и grep.
Если кто-то сможет сделать это с чистой партией, то в каком-то смысле будет лучше.
Но grep и wc — это способ GNU/Linux, который можно использовать в Windows.
copy con aa <-- создает файл aa. Обратите внимание, что в нем есть строка rrr 3 раза.
C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
1 file(s) copied.
(-o в grep -o важен, так как он не возвращает всю строку. И это особенно важно, потому что если rrr встречается много раз в одной строке, вы не хотите, чтобы он отображал rrr только один раз для этой строки. grep -o получает каждое вхождение rrr в новой строке. Общее количество строк тогда является общим количеством вхождений)
C:\blah>grep -o rrr a.a
rrr
rrr
rrr
C:\blah>grep -o rrr a.a | wc -l
3
C:\blah>