2

В настоящее время я пытаюсь написать пакетный скрипт, и в этот момент мне нужно найти строку "null" и определить, сколько раз она отображается в файле.

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

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

Но это только отображает "1", потому что файл только 1 строка.

Есть ли какой-то другой способ вывести количество раз, когда "null" находится в файле?

добавлено барлопом
ОП также упомянул, что не может устанавливать стороннее программное обеспечение.

3 ответа3

2

Я должен верить, что об этом уже спрашивали и отвечали. Но вот простой пакетный скрипт, который может сделать эту работу.

::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/batch под названием REPL.BAT, которая может упростить работу и должна быть достаточно быстрой. Утилита выполняет поиск и замену регулярных выражений в строках, считанных из стандартного ввода, и записывает результат в стандартный вывод. У него есть достаточное количество опций, включая опции, которые упрощают эту задачу. Утилита представляет собой чистый скрипт, который будет работать на любой современной машине с 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"
0

У вас есть возможность скачать один исполняемый файл?

Что вам нужно, это хорошо портированная утилита grep .
например, grep (GNU grep) 2.16

Опция, которую вы хотите, это -c или --count .

Согласно приведенному ниже комментарию @dbenham, способ фактически посчитать не только строки со значением 'null', но и несколько экземпляров PER LINE:

grep -o null file-to-read.txt | grep -c 
-1

Это не очень пуристический подход. Это требует, чтобы вы получили 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .