Как подсчитать количество строк в текстовом файле и сохранить значение в переменной с помощью пакета script?
Я хочу подсчитать количество строк в текстовом файле, а затем значение нужно сохранить в переменной среды. Команда подсчета числа строк
findstr /R /N "^" file.txt | find /C ":"
Я ссылался на вопрос Как сохранить результат выражения команды в переменной с помощью скриптов bat?
Затем я попробовал,
set cmd="findstr /R /N "^" file.txt | find /C ":" "
Я получаю сообщение об ошибке,
FIND: Parameter format not correct
Как я могу избавиться от этой ошибки.
Ответы
Ответ 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%, он просто добавляет строку к текущему файлу.
Ответ 10
Просто:
c:\>(for /r %f in (*.java) do @type %f ) | find /c /v ""
Шрифт: https://superuser.com/questions/959036/what-is-the-windows-equivalent-of-wc-l
Ответ 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