以下是《Go語言100個實戰案例》中的?文件與IO操作篇 - 案例19:統計文件中每個字母出現頻率?的完整內容。本案例適合用來練習文件讀取、字符處理、map統計等基礎技能。
🎯 案例目標
讀取一個本地文本文件,統計并打印出其中每個英文字母(忽略大小寫)出現的次數和頻率。
🧩 應用場景
- ? 文本分析、自然語言處理前的預處理
- ? 編寫字頻統計工具
- ? 簡化數據分析或可視化處理的前置步驟
🧠 涉及知識點
- ? 使用?
os.Open()
?讀取文件 - ??
bufio.Scanner
?按行讀取 - ? 字符串遍歷與判斷
- ? 使用?
map[rune]int
?統計頻率 - ? 轉換大小寫?
unicode.ToLower
💻 示例代碼:統計字母頻率
package?mainimport?("bufio""fmt""os""unicode"
)func?main()?{filePath?:=?"sample.txt"//?打開文件file,?err?:=?os.Open(filePath)if?err?!=?nil?{fmt.Println("無法打開文件:",?err)return}defer?file.Close()//?用于存儲每個字母出現的次數frequency?:=?make(map[rune]int)totalLetters?:=?0scanner?:=?bufio.NewScanner(file)for?scanner.Scan()?{line?:=?scanner.Text()for?_,?ch?:=?range?line?{if?unicode.IsLetter(ch)?{ch?=?unicode.ToLower(ch)frequency[ch]++totalLetters++}}}//?打印結果fmt.Println("字母頻率統計:")for?ch?:=?'a';?ch?<=?'z';?ch++?{count?:=?frequency[ch]if?count?>?0?{percentage?:=?float64(count)?/?float64(totalLetters)?*?100fmt.Printf("%c:?%d?(%.2f%%)\n",?ch,?count,?percentage)}}
}
📂 示例文本內容(sample.txt)
Go?is?expressive,?concise,?clean,?and?efficient.
Its?concurrency?mechanisms?make?it?easy?to?write?programs.
📤 執行結果示例
字母頻率統計:
a:?5?(4.85%)
c:?7?(6.80%)
d:?2?(1.94%)
e:?10?(9.71%)
f:?2?(1.94%)
g:?1?(0.97%)
...
t:?8?(7.77%)
w:?1?(0.97%)
🛠 技術說明
函數 | 說明 |
os.Open() | 打開文件 |
bufio.NewScanner() | 按行掃描文本 |
unicode.IsLetter() | 判斷字符是否為英文字母 |
unicode.ToLower() | 轉換為小寫字母以便統計統一 |
map[rune]int | 使用字符為鍵的字典進行計數 |
🧪 拓展練習
- ? 統計所有字符(包括數字、標點)
- ? 按頻率從高到低排序輸出
- ? 將結果保存為 CSV 或 JSON 文件
- ? 添加參數選擇分析哪個文件或字母范圍(如大寫、小寫)
? 小結
這個案例幫助你掌握了如何在 Go 中進行文本分析,特別是字母頻率統計。這是數據清洗和自然語言處理中的常見需求。