设计思路
- 逐行读取文件:由于文件可能较大,逐行读取可以有效控制内存使用。
- 使用
rune
处理字符:Go语言中的rune
类型可以表示任何Unicode码点,适合处理多种语言字符。
- 分类统计:根据字符的Unicode范围来判断其所属语言类别,然后分别统计每种语言字符的出现次数。
- 高效数据结构:使用
map
来存储每种语言字符的计数,map
查找和插入操作的时间复杂度为O(1)。
关键代码片段
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("your_large_text_file.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 用于统计不同语言字符的map
chineseCount := make(map[rune]int)
arabicCount := make(map[rune]int)
latinCount := make(map[rune]int)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
for _, char := range line {
switch {
case char >= 0x4E00 && char <= 0x9FFF: // 中文字符范围
chineseCount[char]++
case char >= 0x0600 && char <= 0x06FF: // 阿拉伯文字符范围
arabicCount[char]++
case (char >= 0x0041 && char <= 0x005A) || (char >= 0x0061 && char <= 0x007A): // 拉丁文字符范围(大写和小写)
latinCount[char]++
}
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading file:", err)
return
}
fmt.Println("Chinese Characters Count:")
for char, count := range chineseCount {
fmt.Printf("%c: %d\n", char, count)
}
fmt.Println("\nArabic Characters Count:")
for char, count := range arabicCount {
fmt.Printf("%c: %d\n", char, count)
}
fmt.Println("\nLatin Characters Count:")
for char, count := range latinCount {
fmt.Printf("%c: %d\n", char, count)
}
}