You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Go语言删除文本文件中长度小于指定阈值的短行

问题原因

  • 过滤逻辑反向:当前代码仅会在检测到行长度小于3时向缓冲区写入空行,符合长度要求的有效行完全没有被写入缓冲区,无法得到预期结果
  • 缺少回写逻辑:所有处理结果仅暂存在内存的bytes.Buffer中,没有写入到目标文件,自然看不到修改效果

实现方案

常规实现(适合中小文件)

package main

import (
	"bufio"
	"bytes"
	"os"
)

func exit(msg string) {
	println(msg)
	os.Exit(1)
}

func main() {
	minLineLen := 3 // 自定义最小行长度
	targetPath := "你的文件路径.txt"

	// 读取源文件
	file, err := os.Open(targetPath)
	if err != nil {
		exit("打开文件失败:" + err.Error())
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	var resBuf bytes.Buffer

	for scanner.Scan() {
		line := scanner.Text()
		// 若需统计中文字符数,替换为 len([]rune(line))
		if len(line) >= minLineLen {
			if _, err := resBuf.WriteString(line + "\n"); err != nil {
				exit("写入缓冲区失败:" + err.Error())
			}
		}
	}

	if err := scanner.Err(); err != nil {
		exit("读取文件失败:" + err.Error())
	}

	// 回写处理结果到原文件
	if err := os.WriteFile(targetPath, resBuf.Bytes(), 0644); err != nil {
		exit("写入文件失败:" + err.Error())
	}
}

低内存实现(适合GB级大文件,符合边读边处理要求)

该方案无需将所有文件内容加载到内存,通过临时文件中转避免原文件损坏风险

package main

import (
	"bufio"
	"os"
)

func exit(msg string) {
	println(msg)
	os.Exit(1)
}

func main() {
	minLineLen := 3
	targetPath := "你的文件路径.txt"
	tmpPath := targetPath + ".tmp"

	// 打开源文件
	srcFile, err := os.Open(targetPath)
	if err != nil {
		exit("打开源文件失败:" + err.Error())
	}
	defer srcFile.Close()

	// 创建临时文件
	tmpFile, err := os.Create(tmpPath)
	if err != nil {
		exit("创建临时文件失败:" + err.Error())
	}
	defer tmpFile.Close()

	scanner := bufio.NewScanner(srcFile)
	writer := bufio.NewWriter(tmpFile)

	for scanner.Scan() {
		line := scanner.Text()
		if len(line) >= minLineLen {
			if _, err := writer.WriteString(line + "\n"); err != nil {
				exit("写入临时文件失败:" + err.Error())
			}
		}
	}

	if err := scanner.Err(); err != nil {
		exit("读取源文件失败:" + err.Error())
	}

	// 刷新缓冲区到磁盘
	if err := writer.Flush(); err != nil {
		exit("刷新缓冲区失败:" + err.Error())
	}

	// 关闭文件后替换原文件
	_ = srcFile.Close()
	_ = tmpFile.Close()
	if err := os.Rename(tmpPath, targetPath); err != nil {
		exit("替换原文件失败:" + err.Error())
	}
}

内容的提问来源于stack exchange,提问作者Eternal Eclipse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:06:04