Golang实现查找txt文件中出现频率最高的字符

Golang实现查找txt文件中出现频率最高的字符 我是Go语言的新手,目前正在开发一个需要实现以下功能的程序:

  • 统计文本文件中的非空行数
  • 统计同一文本文件中使用频率最高的五个字符
  • 将结果写入新的文本文件

作为Go语言的初学者,我不太确定该如何着手处理这些任务。有没有人能提供一些实现建议?最好能附带部分示例代码进行说明。

4 回复

感谢大家。我会阅读这些文章!根据目前情况来看,映射方案似乎是最适合我的计划

更多关于Golang实现查找txt文件中出现频率最高的字符的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


开始学习如何打开文本文件。然后,您可以根据实际情况选择适合的方法,比如逐行读取文件,或者将所有行读取到字符串或切片中。

我认为使用映射数据类型可以让实现更简单,但会损失一些速度

func main() {

	f, err := os.Open(TXTFILE)

	if err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err)
		return
	}

	defer f.Close()

	reader := bufio.NewReader(f)

	rc := 0
	for {
		s, err := reader.ReadString('\n')
		rc++
		if err == io.EOF {
			break
		}
		fmt.Print(graspRune(s))
	}
}

func graspRune(input string) map[rune]int {

    runes := make(map[rune]int)

    for _, val := range input {
        runes[val]++
    }

    return runes
}

以下是一个完整的Go语言实现方案,可以满足你的需求:

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"unicode"
)

type CharCount struct {
	Char  rune
	Count int
}

func main() {
	// 读取输入文件
	inputFile := "input.txt"
	outputFile := "result.txt"

	// 打开输入文件
	file, err := os.Open(inputFile)
	if err != nil {
		fmt.Printf("无法打开文件: %v\n", err)
		return
	}
	defer file.Close()

	// 统计非空行数和字符频率
	nonEmptyLines := 0
	charFrequency := make(map[rune]int)
	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		line := scanner.Text()
		
		// 检查是否为空行
		if len(strings.TrimSpace(line)) > 0 {
			nonEmptyLines++
		}

		// 统计字符频率
		for _, char := range line {
			if !unicode.IsSpace(char) { // 排除空白字符
				charFrequency[char]++
			}
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("读取文件时出错: %v\n", err)
		return
	}

	// 转换为切片并排序
	var charCounts []CharCount
	for char, count := range charFrequency {
		charCounts = append(charCounts, CharCount{char, count})
	}

	// 按频率降序排序
	sort.Slice(charCounts, func(i, j int) bool {
		return charCounts[i].Count > charCounts[j].Count
	})

	// 获取前5个最频繁的字符
	topChars := 5
	if len(charCounts) < topChars {
		topChars = len(charCounts)
	}

	// 创建输出文件
	output, err := os.Create(outputFile)
	if err != nil {
		fmt.Printf("无法创建输出文件: %v\n", err)
		return
	}
	defer output.Close()

	writer := bufio.NewWriter(output)

	// 写入结果
	fmt.Fprintf(writer, "非空行数: %d\n", nonEmptyLines)
	fmt.Fprintf(writer, "出现频率最高的%d个字符:\n", topChars)
	
	for i := 0; i < topChars; i++ {
		charInfo := charCounts[i]
		fmt.Fprintf(writer, "%d. 字符 '%c' - 出现次数: %d\n", 
			i+1, charInfo.Char, charInfo.Count)
	}

	writer.Flush()
	fmt.Printf("结果已写入文件: %s\n", outputFile)
}

如果你需要导入strings包,请在文件开头添加:

import (
	// ... 其他导入
	"strings"
)

这个程序的主要功能:

  1. 统计非空行数:使用strings.TrimSpace()检查每行是否只包含空白字符
  2. 字符频率统计:使用map[rune]int来记录每个非空白字符的出现次数
  3. 排序处理:将map转换为切片并按频率降序排序
  4. 结果输出:将统计结果写入新的文本文件

运行程序前,请确保当前目录存在名为input.txt的文本文件。程序执行后会生成result.txt文件,包含非空行数和频率最高的5个字符统计信息。

回到顶部