[英]Count the number of lines of each text file in a given directory and store it in a variable
[英]How to count no of lines in text file and store the value into a variable using batch script?
我想計算文本文件中的行數,然后將值存儲到環境變量中。 計算行數的命令是
findstr /R /N "^" file.txt | find /C ":"
我提到了如何使用bat腳本將命令表達式的結果存儲在變量中的問題? 然后我試過,
set cmd="findstr /R /N "^" file.txt | find /C ":" "
我收到錯誤消息,
FIND: Parameter format not correct
我怎么能擺脫這個錯誤。
有一種比所有其他方法簡單得多的方法。
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,則會打印出設備上安裝的應用程序數量。
您可以使用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%
受以前帖子的啟發,這樣做的方式更短:
CMD.exe
C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":"
行數
試試吧。 它適用於我的控制台。
(刪除了“$”標志)
FINDSTR /R /N "^.*" file.txt | FIND /C ":"
$將數字減少1,因為它接受第一行作為字段名稱,然后計算行數。
試試這個:
@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
命令使其快三倍。
@Tony:你甚至可以擺脫type %file%
命令的type %file%
。
for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a
對於長文件,這應該更快。
我通常使用更像這樣的東西for /f %%a in (%_file%) do (set /a Lines+=1)
for /f "usebackq" %A in (`TYPE c:\temp\file.txt ^| find /v /c "" `) do set numlines=%A
在批處理文件中,使用%% A而不是%A
您不需要使用find。
@echo off
set /a counter=0
for /f %%a in (filename) do set /a counter+=1
echo Number of lines: %counter%
這將迭代文件中的所有行,並將每行的計數器變量增加1。
我發現這個解決方案最適合創建一個維護自己的日志文件:
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%變量,它只是將該行添加到當前文件。
只是:
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
在下面的代碼中,變量名稱是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中生成
您可以in(…)
for /f
循環的in(…)
子句in(…)
type
的輸出type
給find
:
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文件中的行,則此答案不適合您。
下面的:countLines
子例程接受兩個參數:變量名; 和文件名。 計算文件中的行數,結果存儲在變量中,結果傳遞回主程序。
該代碼具有以下功能:
(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 =%
我知道它看起來很可怕,但它涵蓋了大多數邊緣情況並且速度驚人。
完美的解決方案是:
FOR /F %%i IN ('TYPE "Text file.txt" ^| FIND /C /V ""') DO SET Lines=%%i
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.