Windowsでは、ファイル内で文字列が出現する回数をカウントする方法はありますか?

Windowsでは、ファイル内で文字列が出現する回数をカウントする方法はありますか?

現在、バッチ スクリプトを作成しようとしていますが、この時点では、文字列「null」を見つけて、それがファイル内に何回表示されるかを判断する必要があります。

スクリプトが起動するたびに Web サイトから API をダウンロードしていますが、その API 内には時々「null」があります。API がダウンロードされると、1 行にダウンロードされますが、私はこれを試しています。

findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt

ただし、ファイルの長さが 1 行しかないため、「1」のみが表示されます。

ファイル内に「null」が何回存在するかを出力する他の方法はありますか?

barlop によって追加されました
OP は、サードパーティのソフトウェアをインストールできないとも述べています。

答え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

大きなファイルの場合、かなり遅くなる可能性があります。


私は書いたREPL.BAT と呼ばれるハイブリッド JScript/バッチ ユーティリティこれにより、作業が簡単になり、かなり高速になります。このユーティリティは、stdin から読み込んだ行に対して正規表現の検索と置換を実行し、その結果を stdout に書き込みます。このタスクを簡素化するオプションなど、多数のオプションがあります。このユーティリティは、XP 以降の最新の Windows マシンで実行できる純粋なスクリプトです。完全なドキュメントはスクリプト内に埋め込まれています。

検索が次の条件を満たしていると仮定して、この方法を使用して問題を解決できます。大文字と小文字を区別

<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

これはあまり純粋主義的なアプローチではありません。coreutils と grep のパッケージを含む gnuwin32 を入手する必要があります。

誰かが純粋なバッチでそれを実行できるなら、ある意味ではなおさら良いことです。

しかし、grep と wc は Windows でも実行できる GNU/Linux の方法です。

copy con aa <-- aa ファイルを作成します。rrr 文字列が 3 回あることに注意してください。

C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
        1 file(s) copied.

(grep -o の -o は重要です。これにより、行全体が返されることはありません。これは特に重要です。なぜなら、rrr が 1 行に何度も出現する場合、その行に対して rrr を 1 回だけ表示したくないからです。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>

関連情報