簡體   English   中英

如何計算文本文件中的行數並使用批處理腳本將值存儲到變量中?

[英]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

在下面的代碼中,變量名稱是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中生成

您可以in(…) for /f循環的in(…)子句in(…) type的輸出typefind

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子例程接受兩個參數:變量名; 和文件名。 計算文件中的行數,結果存儲在變量中,結果傳遞回主程序。

該代碼具有以下功能:

  • 使用Windows或Unix行結尾讀取文件。
  • 處理Unicode以及ANSI / ASCII文本文件。
  • 應對極長的線條。
  • 不要被空字符所迷惑。
  • 讀取空文件時出錯。
  • 超過Batch max int limit (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM