首页 > 其他分享 >在两个大文件中找出相同的记录,用golang如何写?

在两个大文件中找出相同的记录,用golang如何写?

时间:2024-08-09 09:39:53浏览次数:12  
标签:文件 找出 scanner err map 记录 golang 读取

在两个大文件中找出相同的记录,可以使用Golang实现高效的算法。这里主要涉及以下几个步骤:

  1. 读取文件:逐行读取两个大文件。

  2. 使用数据结构存储记录:可以使用Go的map数据结构来存储其中一个文件的记录,之后遍历另一个文件,检查其记录是否在map中,若在则记录下该相同记录。

  3. 输出结果:将找到的相同记录输出或写入新的文件。

以下是一个实现思路及代码示例。

思路

文件读取

  • 使用bufio.Scanner逐行读取文件内容,这样可以处理大文件而不需要将文件内容一次性全部加载到内存中。

存储数据

  • 使用map[string]bool来存储第一个文件的记录。map具有快速查找的特性,能够保证在后续的操作中快速判断记录是否存在。

查找相同记录

  • 遍历第二个文件,逐行读取并检查是否存在于第一个文件的记录集合中,若存在则记录下该相同的记录。

输出相同记录

  • 将找到的相同记录输出到标准输出或写入到新的文件中。

代码示例

package main

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

func main() {
    // 第一个大文件的路径
    file1Path := "file1.txt"
    // 第二个大文件的路径
    file2Path := "file2.txt"

    // 打开第一个文件
    file1, err := os.Open(file1Path)
    if err != nil {
        log.Fatalf("Failed to open file1: %v", err)
    }
    defer file1.Close()

    // 使用map来存储第一个文件的所有记录
    recordMap := make(map[string]bool)

    scanner := bufio.NewScanner(file1)
    for scanner.Scan() {
        line := scanner.Text()
        recordMap[line] = true
    }

    // 检查是否有读取错误
    if err := scanner.Err(); err != nil {
        log.Fatalf("Error reading file1: %v", err)
    }

    // 打开第二个文件
    file2, err := os.Open(file2Path)
    if err != nil {
        log.Fatalf("Failed to open file2: %v", err)
    }
    defer file2.Close()

    scanner = bufio.NewScanner(file2)
    for scanner.Scan() {
        line := scanner.Text()
        // 如果记录在第一个文件的map中存在,则输出
        if _, found := recordMap[line]; found {
            fmt.Println(line) // 或者将结果写入到另一个文件
        }
    }

    // 检查是否有读取错误
    if err := scanner.Err(); err != nil {
        log.Fatalf("Error reading file2: %v", err)
    }
}

代码解释

  1. 读取文件内容:使用bufio.NewScanner逐行读取文件,适合处理大文件。

  2. 存储第一个文件的内容:将每一行的记录作为map的键值,map[string]bool类型的map非常适合这个任务,快速查找并且能防止重复记录。

  3. 查找相同记录:遍历第二个文件的每一行,判断是否在第一个文件的map中出现,若出现则打印该行(或存储到输出文件中)。

注意事项

  • 内存消耗:该方案的内存消耗主要取决于第一个文件中记录的数量。如果文件非常大,导致内存不足,可以考虑对文件进行分块处理或者使用外部排序等技术来优化。

  • 记录的唯一性:该方法假设每一行都是唯一的记录。如果记录中可能存在重复行,并且你需要处理重复的行,可以考虑使用map[string]int来存储记录次数。

通过这种方式,能够高效地在两个大文件中找到相同的记录

标签:文件,找出,scanner,err,map,记录,golang,读取
From: https://www.cnblogs.com/cheyunhua/p/18350181

相关文章

  • Python面试宝典第30题:找出第K大元素
    题目        给定一个整数数组nums,请找出数组中第K大的数,保证答案存在。其中,1<=K<=nums数组长度。        示例1:输入:nums=[3,2,1,5,6,4],K=2输出:5        示例2:输入:nums=[50,23,66,18,72],K=3输出:50快速选择算法......
  • 打靶记录8——y0usef
    靶机地址https://download.vulnhub.com/y0usef/y0usef.ova目标取得root权限+2个flag涉及的攻击方法主机发现端口扫描Web信息收集指纹探测403Bypass文件上传提权主机扫描nmap-sn192.168.0.0/24192.168.0.102就是靶机地址端口扫描和服务发现nmap-p-192.1......
  • Cpp中的this指针--复习记录
    1.什么是this指针?  每个类都有一个this指针,我们的非静态成员函数可以通过这个this指针来操作对象的成员属性。this指针存储的就是类的实例的地址,this指针时时刻刻指向的都是这个实例对象本身。由下图可知:我在主函数中栈上创建了一个类的实例(由操作系统自动回收释放......
  • 比赛记录(31~40)
    312024.8.31得分题目T1T2T3T4总分得分\(0\)\(20\)\(60\)\(0\)\(80\)排名:rank\(12\)。2题解T1考虑最小的数,显然它要放到最左边或者最右边,那么它要交换的次数就是它左边比它大的数的个数或者右边比他大的数的个数,两者取\(\min\)即可。显然将最小......
  • Golang 中 defer panic recover 简单使用
    Golangdefer、panic、recoverdeferdefer语句用于延迟执行一个函数调用,直到包含该defer语句的函数执行完毕。defer语句通常用于释放资源、关闭文件、解锁互斥锁等操作。defer语句的执行顺序是后进先出,即最后被defer的语句最先执行。例如:funcmain(){deferfmt.Pr......
  • 好题记录 8.8
    CF1325FEhab’sLastTheorem题意给定一个nnn个点,mmm条边的无......
  • golang基础-工作区和gopath
    gobuild命令一些可选项的用途和用法在运行gobuild命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。如果要强制编译它们,可以在执行命令的时候加入标记-a。此时,不但目标代码包总是会被编......
  • Pikachu靶场练习记录--2--Cross-Site Scripting(xss)
        1.简述        XSS攻击,即跨站脚本攻击,是一种网络安全威胁。为了避免与层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,因此将跨站脚本攻击缩写为XSS。此类攻击通过在Web页面中插入恶意的脚本代码,用户在访问该页面时,这些嵌入的脚本代码会被执行,从而对用户......
  • Pikachu靶场练习记录--1--Burt Force(暴力破解漏洞)
        1.基于表单的暴力破解随便输入点东西,打开bp拦截抓包。准备好开始进攻          下面显示登陆成功。    2.验证码绕过(onserver)依然使用暴力破解对目标登录成功。    3.验证码绕过(onclient)但是下面的英文显......
  • Golang zap 日志简单实用
    zapGolang第三方库记录日志Zap是非常快的、结构化的、分日志级别的Go日志库功能简介可以配置日志输入格式JSON和普通文本可以配置日志输出位置控制台和文件可以配置日志级别debug、info、warn、error安装goget-ugo.uber.org/zap基本使用logger,err:=z......