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

如何用Golang对比两个链接文件并提取新链接至第三文件?

问题分析与解决方案

原代码的核心问题

  • 统计逻辑错误:原代码是逐行同步扫描两个文件,仅对比对应位置的行是否相同,这并非“找出新文件中不存在于旧文件的行”的正确逻辑。只要两行内容重复但位置不同,就会被误判为新行,导致统计结果远大于实际值。
  • 缺少新链接存储逻辑:现有代码未实现将新行写入第三个文件的功能。

修正后的完整代码

package main

import (
	"bufio"
	"fmt"
	"os"
)

// CompareAndExtractNewLines 对比两个文件,提取新文件中独有的行并写入第三个文件
func CompareAndExtractNewLines() {
	// 打开旧文件,读取所有行存入map用于快速查找
	oldFile, err := os.Open("Links_Old.txt")
	if err != nil {
		fmt.Println("打开旧文件失败:", err)
		return
	}
	defer oldFile.Close()

	oldLines := make(map[string]struct{})
	scannerOld := bufio.NewScanner(oldFile)
	for scannerOld.Scan() {
		line := scannerOld.Text()
		if line != "" { // 跳过空行(可选,根据需求调整)
			oldLines[line] = struct{}{}
		}
	}
	if err := scannerOld.Err(); err != nil {
		fmt.Println("扫描旧文件出错:", err)
		return
	}

	// 打开新文件,遍历每一行,检查是否不在旧文件中
	newFile, err := os.Open("Links_New.txt")
	if err != nil {
		fmt.Println("打开新文件失败:", err)
		return
	}
	defer newFile.Close()

	// 创建存储新行的文件
	outputFile, err := os.Create("New_Only_Links.txt")
	if err != nil {
		fmt.Println("创建输出文件失败:", err)
		return
	}
	defer outputFile.Close()
	writer := bufio.NewWriter(outputFile)
	defer writer.Flush()

	newLineCount := 0
	scannerNew := bufio.NewScanner(newFile)
	for scannerNew.Scan() {
		line := scannerNew.Text()
		if line == "" {
			continue // 跳过空行
		}
		// 检查当前行是否不在旧文件的行集合中
		if _, exists := oldLines[line]; !exists {
			newLineCount++
			// 将新行写入输出文件
			_, err := writer.WriteString(line + "\n")
			if err != nil {
				fmt.Println("写入新行失败:", err)
				return
			}
		}
	}
	if err := scannerNew.Err(); err != nil {
		fmt.Println("扫描新文件出错:", err)
		return
	}

	fmt.Printf("共找到 %d 条新链接,已写入 New_Only_Links.txt\n", newLineCount)
}

// UpdateOldFile 将新文件内容覆盖到旧文件(保留原功能)
func UpdateOldFile() {
	src, err := os.Open("Links_New.txt")
	if err != nil {
		fmt.Println("打开源文件失败:", err)
		return
	}
	defer src.Close()

	dst, err := os.Create("Links_Old.txt")
	if err != nil {
		fmt.Println("创建目标文件失败:", err)
		return
	}
	defer dst.Close()

	_, err = bufio.NewReader(src).WriteTo(dst)
	if err != nil {
		fmt.Println("复制文件内容失败:", err)
		return
	}
	fmt.Println("旧文件已更新为新文件内容")
}

func main() {
	CompareAndExtractNewLines()
	// UpdateOldFile() // 如果需要更新旧文件,取消注释
}

关键改进点

  • 用Map存储旧文件行:利用map的O(1)查找特性,快速判断新文件的行是否存在于旧文件中,彻底解决逐行同步对比的逻辑错误。
  • 新增新行写入功能:遍历新文件时,将不在旧文件中的行直接写入第三个文件,完成存储需求。
  • 空行处理:添加空行跳过逻辑,避免无效行干扰统计和存储(可根据实际需求调整)。
  • 错误处理优化:将panic改为友好的错误提示,避免程序直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:15:35