it-swarm.com.ru

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

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

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

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

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

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

 НАЙТИ: неверный формат параметра 

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

45
rashok

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

Я использую cmd-variable, поэтому нет необходимости экранировать канал или другие символы в cmd-строке, так как отложенное расширение передает строку «без изменений» в цикл FOR.

@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%
33
jeb

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

find /v /c "" filename.ext

Видимо, пережиток прежних дней MS-DOS. Более подробная информация здесь: http://blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx

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

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

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

84
user169771

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

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

Количество строк

Попытайся. Это работает в моей консоли.

Редакция:

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

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

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

16
Tin Amaranth

Попробуй это:

@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. Удаление команды TYPE ускоряет ее в три раза.

8
Tony

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

4
Ray

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

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

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

4
Dazzam

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

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

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

3
Andreas Mångs
 для/f "usebackq"% A в (`TYPE c:\temp\file.txt ^ | find/v/c" "`) установить numlines =% A

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

2
Tom Warfield

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

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%, имя компьютера удаленного клиента% Date% - текущая дата, а% Time% - текущее время. : NEXT вызывается после получения количества строк в файле. Если число строк файла больше, чем переменная% maxlines%, он переходит к: EXITLOOP, где он перезаписывает файл, создавая новую строку с первой строкой информации. если она меньше переменной% maxlines%, она просто добавляет строку в текущий файл. 

2
joopykunk

Просто:

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

1
Carlos.Cândido

Вы можете направить вывод 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 in счетными строками в файле .

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

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
Sponge Belly

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

0
Sarath Avanavu

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

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

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

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

0
Sponge Belly