如何计算文本文件中的行数并使用批处理脚本将值存储到变量中?

时间:2011-04-14 14:27:54

标签: windows batch-file cmd

我想计算文本文件中的行号,然后将值存储到环境变量中。计算行数的命令是

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

我提到问题How to store the result of a command expression in a variable using bat scripts? 然后我试了,

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

我收到错误消息

FIND: Parameter format not correct

我怎么能摆脱这个错误。

16 个答案:

答案 0 :(得分:87)

有一种比所有其他方法更简单的方法。

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设备已连接到您的PC并且您的路径上有Android SDK,则会打印出您设备上安装的应用程序数量。

答案 1 :(得分:34)

您可以使用FOR / F循环将输出分配给变量。

我使用cmd-variable,因此不需要转义cmd-string中的管道或其他字符,因为延迟扩展将字符串“未更改”传递给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 :(得分:16)

受到之前帖子的启发, 一个较短的方法:

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

行数

试试吧。它可以在我的控制台中使用。

EDITED:

(删除" $"符号)

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

$将数字减少1,因为它接受第一行作为字段名称,然后计算行数。

答案 3 :(得分:9)

试试这个:

@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命令会使其快三倍。

答案 4 :(得分:4)

@Tony:你甚至可以摆脱type %file%命令。

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

对于长文件,这应该更快。

答案 5 :(得分:4)

我通常使用更像这样的东西         for /f %%a in (%_file%) do (set /a Lines+=1)

答案 6 :(得分:3)

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

在批处理文件中,使用%% A代替%A

答案 7 :(得分:3)

您不需要使用find。

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

这将迭代文件中的所有行,并为每行增加1的计数器变量。

答案 8 :(得分:2)

我发现这个解决方案最适合创建一个自我维护的日志文件:

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%变量,它只是将该行添加到当前文件。

答案 9 :(得分:1)

只是:

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

答案 10 :(得分:0)

在下面的代码中,变量名称为SalaryCountTaxCount

@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

中生成

答案 11 :(得分:0)

您可以在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中已故的counting lines in a file所说明的那样。

然后,你可以一直尝试:

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文件中的行数,那么这个答案不适合您。

答案 12 :(得分:0)

一个令人惊奇的惊喜是,他的Windows上有git bash:只有普通的旧Linux wc -l <filename>会为您服务

答案 13 :(得分:0)

你也可以试试

sudo apt-get install -y pkg-config
sudo apt-get update
sudo apt install gcc
sudo apt-get install tcl
sudo make distclean
sudo make

答案 14 :(得分:-1)

完美的解决方案是:

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

答案 15 :(得分:-1)

您也可以用通配符*标记,以方便组文件计数。

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