天天看點

批處理FOR 中的Delims和Tokens總結

        本篇為《FOR入門與精通秘籍》的補充内容。由于《FOR入門與精通秘籍》是當初剛開始學FOR時一邊學一邊寫的,思維難免受人家影響,思考的也不夠全面,是以存在很多缺點,但又不想做過多修改,隻好補寫了這篇東西。

       在For指令語句的參數F中,最難了解的就是Delims和Tokens兩個選項,本文簡單的做一個比較和總結。

“For /f”常用來解析文本,讀取字元串。分工上,delims負責切分字元串,而tokens負責提取字元串。如果把字元串當作蛋糕,Delims像刀子,用來切蛋糕,tokens像叉子,用來取切好的蛋糕。下面我們用執行個體來進行了解。

       把以下内容儲存為文本檔案“歌曲清單.txt”,注意擴充名為“.txt”:

序号、歌手名-歌曲名.字尾名

1、饒天亮-玫瑰夫妻.wma

2、高一首-我不願錯過.mp3

3、黃凱芹-傷感的戀人.MP3

4、黃燦-黃玫瑰.lrc

5、黎姿-如此這般的愛情故事.mp3 

代碼1:顯示全部内容

@echo off

for /f %%i in (歌曲清單.txt) do echo %%i

pause>nul

運作結果:

序号、歌手名-歌曲名.字尾名

1、饒天亮-玫瑰夫妻.wma

2、高一首-我不願錯過.mp3

3、黃凱芹-傷感的戀人.MP3

4、黃燦-黃玫瑰.lrc

5、黎姿-如此這般的愛情故事.mp3

講解:

如果不使用參數“/f”,運作結果隻顯示括号裡的文字字元“歌曲清單.txt”,而不能讀取文本檔案“歌曲清單.txt”中的内容。可見,“/f”是解析文本字元串的好工具。 

一、delims

       假如隻要序号,不要歌手名、歌曲名和字尾名,如何辦到?

代碼2:預設提取第一列

@echo off

for /f "delims=、" %%i in (歌曲清單.txt) do echo %%i

pause>nul

運作結果:

序号

1

2

3

4

5

講解:

"delims=、"表示定義頓号“、”為分隔符,并用該分隔符“、”切分文本字元串。字元串就是“歌曲清單.txt”裡的内容,也就是檔案裡的文字和标點符号。

該頓号是原文中就有的。除了頓号“、”,原文中還有減号“-”和點号“.”,是以你也可以用它們來做分隔符。

代碼3:用減号“-”做分隔符

@echo off

for /f "delims=-" %%i in (歌曲清單.txt) do echo %%i

pause>nul

運作結果:

序号、歌手名

1、饒天亮

2、高一首

3、黃凱芹

4、黃燦

5、黎姿

講解:

因為,當減号“-”被用做分隔符時,每行内容被減号“-”分隔成前後兩半,預設隻顯示前半部分,而後半部分連同分隔符減号“-”都被忽略(省略)了。

代碼4:用點号“.”做分隔符

@echo off

for /f "delims=." %%i in (歌曲清單.txt) do echo %%i

pause>nul

運作結果:

序号、歌手名-歌曲名

1、饒天亮-玫瑰夫妻

2、高一首-我不願錯過

3、黃凱芹-傷感的戀人

4、黃燦-黃玫瑰

5、黎姿-如此這般的愛情故事

講解:

預設情況下,單純使用delims而不用tokens時,隻顯示第一個分隔符前的内容,第一個分隔符和第一個分隔符後面的内容将被忽略。

代碼5:定義多個分隔符

@echo off

for /f "delims=、-." %%i in (歌曲清單.txt) do echo %%i

pause>nul

運作結果:

序号

1

2

3

4

5

講解:

原因是,當定義頓号“、”、減号“-”和點号“.”三個标點符号為分隔符後,原文被分隔成四個部分。

如第二行“1、饒天亮-玫瑰夫妻.wma”将被分隔成“1”、“饒天亮”、“玫瑰夫妻”和“wma” 四個部分。

從第一行到最後一行,每行的每個部分對應下來相當于一個豎列。是以,原文就有“序号”、“歌手名”、“歌曲名”、“字尾名”四列。

一般情況下,隻讀取第一列的内容。後面的内容需要用tokens選項提取。