
批處理查找出/獲取txt文本中字符個數最多的行/字符串長度最長的行最后由 pcl_test 于 -9-9 22:47
以上是淺默寫的,也算是比較適合我這類新手更容易看懂的代碼,在我自己寫以及查看高手門代碼的時候,遇到了很多不懂,也小有心得體會,所以我就發(fā)了這個帖子詢問,因為論壇發(fā)貼規(guī)則,題目我就這樣寫了,也算是一個筆記吧先寫關于這個代碼的我懂的:nclick="copycode($('code0'));">復制代碼
- @echo off
- Setlocal Enabledelayedexpansion
- set n=0
- for /f delims= %%i in (a.txt) do (
- set ke=%%i
- set ke1=!ke: =!
- set m=0
- call :1
- call echo %%ke1%%
- )
- echo %wang%
- pause
- goto :eof
- :1
- if not !ke1:~%m%,1!== set /a m+=1&goto 1
- if %m% gtr %n% set n=%m%&set wang=%ke%
- echo %m%
- goto :eof
這基本上可以算是一個替換字符的模本,看看這一句set %%i=!%%i: =!,echo %%i,會發(fā)現set完全沒有作用。也就是說%%i這樣的變量是不能直接進行字符串替換的,當然,也可以set ke=!ke: =!。ke只是一個名字而已,可以用其他字符替換,不過最好是有意義的,并且看的懂的。這里為什么是ke1而不是ke?下面再解釋。set m=0if not !ke1:~%m%,1!== set /a m+=1&goto 1這兩句一定要放在一起來說,這兩句代碼是最簡單的求字符串長度代碼,原理后面會提到。如果只是求1段字符串長度的話,其實后面一句就可以了,只不過在這個程序里,他是要對每一行分別計算長度,有很多個不同的值,為什么要定義m=0?因為我們在計算第一行字符串長度后,需要把變量m初始化為0,才能正確的計算下面每行的長度,如果不初始化,那么在計算完第一行后,m將會被定義數x,如果第2行的字符串長度沒有第一行多,而且如果字符數不為0的話,那么他就會簡單的把x這個值賦予第2行的字符串長度m,但實際上沒那么多。如果第3行比第1行多,那么第3行將能正確的取得,但是第4行如果又少了的話,那么第4行將會取得上1個循環(huán)的數,也就是第3行的數,以此類推。而且這個set m=0的位置非常講究,如果放在for循環(huán)前,結果將會跟沒定義一樣,為什么?因為這個計算只是在循環(huán)內部計算,外部定義對內部沒有起到作用,如果放在子代碼段開頭呢?將會發(fā)現程序進入了死循環(huán),因為這段對每一行字符串長度進行計算的時候,他是先去掉第一個字符,如果剩下的字符不為空的話,m自加1為1,然后再計算剩下的字符,如果還不為空,那么m自加1為2,以此類推。如果你在子代碼段開頭設置set n=0,將會使m=0,而不是1,然后再進行計算,這樣他永遠就無法計算出來,從第一行開始就進入死循環(huán)。set n=0 if %m% gtr %n% set n=%m%&set wang=%ke%set ke1=!ke: =!這里用set ke1=!ke: =!是因為題目要求,如果我們用set ke=!ke: =!的話,在代碼執(zhí)行到最后,ke的值是一行沒有空格的字符串,我們輸出(echo %wang%)時,得到的也就是一串沒有空格的字符串,但是這里為什么會在程度段開頭就設置n=0,并且在子代碼段里對n跟m進行比較,并賦值呢?看代碼的意思:如果字符串長度比n大,那么n就等于字符串長度,關鍵在于set wang=%ke%是怎樣把字符串最長的行(帶空格)賦予wang的呢?再來觀察整個程序,就會小有發(fā)現,如果第1行的字符串長度比0大,那么wang就等于第1行字符串,如果后面的行都沒有n(這里是第1行的的字符串長度)大,那么就不會對n進行再賦值,wang就沒有變化。。。但是如果后面的值有比前面的大,那么就重新進行賦值,最后就能得出正確的結果關鍵是最后的代碼,想了我2天,才想明白,所以就發(fā)來,希望有不明白的可以看到,明白的就飄過算了,如有不對請指點指點。就像老師教編程的時候一樣,說程序本身并不重要,重要的是思想[ 最后由 sgaizxt001 于 -2-6 04:14]nclick="copycode($('code1'));">復制代碼
- for /f delims= %%i in (a.txt) do (
- set ke=%%i
- set ke1=!ke: =!

