请教复杂的文件比对问题

大家好 像这种简单的字符串比对我会编写

func TestSplit(t *testing.T) {
    got := strings.Split("a:b:c", ":")
    want := []string{"a", "b", "c"};
    if !reflect.DeepEqual(got, want) { /* ... */ }
}

var a, b []string = nil, []string{}
fmt.Println(reflect.DeepEqual(a, b)) // "false"

var c, d map[string]int = nil, make(map[string]int)
fmt.Println(reflect.DeepEqual(c, d)) // "false"

请问如何编写载入一个文件名a.txt, a文件名内有200万行,每一行有0~9加英文大小写混合组成的33字或34个字字符串,跟另一个文件名b.txt, b文件名内有300万行,每一行有0~9加英文大小写混何组成的33字或34个字字符串,b文件跟a文件比较,只要b文件中其中有一行字符串跟a文件中其中有一行字符串完全一样就在终端机输出显示,如果沒有完全一樣的就不顯示,比对完自动载入下一个文件进行比对,以此类推
在此先感谢能教我如何编写的大神

awesee
最佳答案

方法一(最优)

借助数据库,添加一张表,比如表名file1,再添加一列比如line,在列上添加唯一索引。从文件中读取每一行,插入到表中,如果插入失败,说明是重复的,因为列有唯一索引。

方法二(耗时少,内存占用大)

假设内存足够大,可以用go,map类型存储每一行,定义map类型为 map[string]bool,就可以了。

方法三(空间占用小,但是耗时)

遍历文件,每一行做对比,伪代码如下:

for line1 := range file1 {
    for line2 := range file2 {
        if line1 == line2 {
            fmt.Println(line1)
        }
    }
}
4年前 评论
讨论数量: 3
awesee

方法一(最优)

借助数据库,添加一张表,比如表名file1,再添加一列比如line,在列上添加唯一索引。从文件中读取每一行,插入到表中,如果插入失败,说明是重复的,因为列有唯一索引。

方法二(耗时少,内存占用大)

假设内存足够大,可以用go,map类型存储每一行,定义map类型为 map[string]bool,就可以了。

方法三(空间占用小,但是耗时)

遍历文件,每一行做对比,伪代码如下:

for line1 := range file1 {
    for line2 := range file2 {
        if line1 == line2 {
            fmt.Println(line1)
        }
    }
}
4年前 评论

@openset 我试试编写看看,在请大神我看看哪里写的不好修要修改

4年前 评论

比行一不一样,不需要找出具体哪个字符不一样的时候 ,可以 hash 这一行然后比较

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!