Как посчитать количество строк в текстовом файле и сохранить значение в переменной с помощью пакетного скрипта? - PullRequest
47 голосов
/ 14 апреля 2011

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

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

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

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

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

FIND: Parameter format not correct

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

Ответы [ 14 ]

0 голосов
/ 06 декабря 2018

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

FOR /F %%i IN ('TYPE "Text file.txt" ^| FIND /C /V ""') DO SET Lines=%%i
0 голосов
/ 04 марта 2018

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

Код имеет следующие особенности:

  • Считывает файлы с окончаниями строк Windows или Unix.
  • Обрабатывает Unicode, а также текстовые файлы ANSI / ASCII.
  • Справляется с чрезвычайно длинными строками.
  • Нулевой символ не смущает.
  • Вызывает ошибку при чтении пустого файла.
  • Считает, что максимальный Int Batch равен (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 =%

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

0 голосов
/ 03 марта 2018

Вы можете передать вывод 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, этот ответ не для вас.

0 голосов
/ 03 сентября 2016

В приведенном ниже коде имя переменной: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...