如何使用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
相关产品推荐
相关产品推荐

