Подтвердить что ты не робот

Как подсчитать количество строк в текстовом файле и сохранить значение в переменной с помощью пакета script?

Я хочу подсчитать количество строк в текстовом файле, а затем значение нужно сохранить в переменной среды. Команда подсчета числа строк

findstr /R /N "^" file.txt | find /C ":"

Я ссылался на вопрос Как сохранить результат выражения команды в переменной с помощью скриптов bat? Затем я попробовал,

set cmd="findstr /R /N "^" file.txt | find /C ":" "

Я получаю сообщение об ошибке,

FIND: Parameter format not correct

Как я могу избавиться от этой ошибки.

4b9b3361

Ответ 1

Вы можете использовать цикл FOR/F, чтобы назначить вывод переменной.

Я использую cmd-variable, поэтому не обязательно скрывать трубку или другие символы в cmd-строке, так как замедленное расширение передает строку "неизмененной" в FOR-Loop.

@echo off
cls
setlocal EnableDelayedExpansion
set "cmd=findstr /R /N "^^" file.txt | find /C ":""

for /f %%a in ('!cmd!') do set number=%%a
echo %number%

Ответ 2

Существует гораздо более простой способ, чем все эти другие методы.

find /v /c "" filename.ext

Видимо, пережиток унаследованных дней MS-DOS. Больше информации здесь: https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803

Пример использования:

adb shell pm list packages | find /v /c ""

Если ваше устройство Android подключено к вашему ПК, и на вашем пути есть Android SDK, это напечатает количество приложений, установленных на вашем устройстве.

Ответ 3

Вдохновленный предыдущими сообщениями, более короткий способ сделать это:

CMD.exe
C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":"

Число строк

Попробуйте. Он работает на моей консоли.

Редакция:

(удаляется знак "$" )

FINDSTR /R /N "^.*" file.txt | FIND /C ":"

$уменьшает число на 1, потому что он принимает первую строку как имя поля и затем подсчитывает количество строк.

Ответ 4

Попробуйте следующее:

@Echo off
Set _File=file.txt
Set /a _Lines=0
For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j
Echo %_File% has %_Lines% lines.

Он устраняет дополнительный FindStr и не нуждается в расширении.


- отредактирован для использования предложения ChrisJJ redirect. Удаление команды TYPE делает ее в три раза быстрее.

Ответ 5

@Tony: вы даже можете избавиться от команды type %file%.

for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a

Для длинных файлов это должно быть еще быстрее.

Ответ 6

Я обычно использую нечто большее       for /f %%a in (%_file%) do (set /a Lines+=1)

Ответ 7

for /f "usebackq" %A in (`TYPE c:\temp\file.txt ^| find /v /c "" `) do set numlines=%A

в пакетном файле, используйте %% A вместо% A

Ответ 8

Вам не нужно использовать find.

@echo off
set /a counter=0
for /f %%a in (filename) do set /a counter+=1
echo Number of lines: %counter%

Это выполняет итерацию всех строк в файле и увеличивает переменную счетчика на 1 для каждой строки.

Ответ 9

Я нашел, что это решение лучше всего подходит для создания файла журнала, который поддерживает себя:

setlocal enabledelayedexpansion
SET /A maxlines= 10
set "cmd=findstr /R /N "^^" "filename.txt" | find /C ":""
 for /f %%a in ('!cmd!') do set linecount=%%a
GOTO NEXT

:NEXT 
 FOR /F %%A IN ("filename.txt") DO ( 
  IF %linecount% GEQ %maxlines% GOTO ExitLoop
  echo %clientname% %Date% %Time% >> "filename.txt")
 EXIT

:ExitLoop
 echo %clientname% %Date% %Time% > "filename.txt"
 EXIT

Включены переменные среды:% clientname% имя_компьютера удаленного клиента% Дата% - текущая дата и% Время% текущего времени.: NEXT вызывается после получения количества строк в файле. Если количество строк в файле больше, чем% maxlines%, оно переходит в: EXITLOOP, где он перезаписывает файл, создавая новый с первой строкой информации. если он меньше переменной% maxlines%, он просто добавляет строку к текущему файлу.

Ответ 11

Идеальное решение:

FOR /F %%i IN ('TYPE "Text file.txt" ^| FIND /C /V ""') DO SET Lines=%%i

Ответ 12

В приведенном ниже коде имя переменной SalaryCount и TaxCount

@ECHO OFF    
echo Process started, please wait...    
for /f %%C in ('Find /V /C "" ^< "D:\Trial\Salary.txt"') do set SalaryCount=%%C    
echo Salary,%SalaryCount%
for /f %%C in ('Find /V /C "" ^< "D:\Trial\Tax.txt"') do set TaxCount=%%C
echo Tax,%TaxCount%

Теперь, если вам нужно вывести эти значения в файл csv, вы можете использовать приведенный ниже код.

@ECHO OFF
cd "D:\CSVOutputPath\"
echo Process started, please wait...
echo FILENAME,FILECOUNT> SUMMARY.csv
for /f %%C in ('Find /V /C "" ^< "D:\Trial\Salary.txt"') do set Count=%%C
echo Salary,%Count%>> SUMMARY.csv
for /f %%C in ('Find /V /C "" ^< "D:\Trial\Tax.txt"') do set Count=%%C
echo Tax,%Count%>> SUMMARY.csv

> перезапишет существующее содержимое файла, а >> добавит новые данные в существующие данные. CSV будет сгенерирован в D:\CSVOutputPath

Ответ 13

Вы можете передать вывод type в find внутри предложения in(…) цикла for/f:

for /f %%A in ('
    type "%~dpf1" ^| find /c /v ""
') do set "lineCount=%%A"

Но труба запускает подоболочку, что замедляет работу.

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

for /f %%A in ('
    find /c /v "" ^< "%~dpf1"
') do set "lineCount=%%A"

Но этот подход даст вам ответ на 1 меньше фактического количества строк, если файл заканчивается одной или несколькими пустыми строками, как подделка поздним foxidrive при подсчете строк в файле.

И снова вы всегда можете попробовать:

find /c /v "" example.txt

Проблема в том, что вывод команды выше выглядит следующим образом:

---------- EXAMPLE.TXT: 511

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

Вот почему я беру на себя эту проблему:

for /f "delims=" %%A in ('
    find /c /v "" "%~1"
') do for %%B in (%%A) do set "lineCount=%%B"

Это всегда будет хранить счетчик в переменной.

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

Ответ 14

Подпрограмма :countLines ниже принимает два параметра: имя переменной; и имя файла. Количество строк в файле подсчитывается, результат сохраняется в переменной, и результат возвращается к основной программе.

Код имеет следующие функции:

  • Читает файлы с окончанием строки Windows или Unix.
  • Обрабатывает Unicode, а также текстовые файлы ANSI/ASCII.
  • Копы с чрезвычайно длинными линиями.
  • Не испуган нулевым символом.
  • Вызывает ошибку при чтении пустого файла.
  • Считается за пределы максимального предела пакета (31^2)-1.
@echo off & setLocal enableExtensions disableDelayedExpansion

call :countLines noOfLines "%~1" || (
    >&2 echo(file "%~nx1" is empty & goto end
) %= cond exec =%
echo(file "%~nx1" has %noOfLines% line(s)

:end - exit program with appropriate errorLevel
endLocal & goto :EOF

:countLines result= "%file%"
:: counts the number of lines in a file
setLocal disableDelayedExpansion
(set "lc=0" & call)

for /f "delims=:" %%N in ('
    cmd /d /a /c type "%~2" ^^^& ^<nul set /p "=#" ^| (^
    2^>nul findStr /n "^" ^&^& echo(^) ^| ^
    findStr /blv 1: ^| 2^>nul findStr /lnxc:" "
') do (set "lc=%%N" & call;) %= for /f =%

endlocal & set "%1=%lc%"
exit /b %errorLevel% %= countLines =%

Я знаю, что это выглядит отвратительно, но он охватывает большинство краевых дел и на удивление быстро.

Ответ 15

Один приятный сюрприз для того, у кого git bash на его окнах: просто старый Linux wc -l <filename> будет работать для вас там

Ответ 16

Вы также можете пометить подстановочным знаком *, чтобы облегчить подсчет групповых файлов.

Z:\SQLData>find /c /v "" FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_*.txt

Результат

---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIFRS01_V1.TXT: 2041

---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIOST00_V1.TXT: 315938

---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIFRS00_V1.TXT: 0

---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_CNTPTF00_V1.TXT: 277