首页 > 解决方案 > 比较 CSV 和差异结论

问题描述

我开始编写一个程序来比较两个 CSV 文件。阅读文档后,我找到了一个解决方案,因为该函数返回 true/false,因此我无法弄清楚如何打印与第二个文件的差异

package main

import (
    "encoding/csv"
    "fmt"
    "os"
    "reflect"
)

func main() {
    file, err := os.Open("sms_in_max.csv")
    if err != nil {
        fmt.Println(err)
    }
    reader := csv.NewReader(file)
    records, _ := reader.ReadAll()
    fmt.Println(records)
    file2, err := os.Open("sms_out.csv")
    if err != nil {
        fmt.Println(err)
    }
    reader2 := csv.NewReader(file2)
    records2, _ := reader2.ReadAll()
    fmt.Println(records2)
    allrs :=reflect.DeepEqual(records, records2)
    fmt.Println(allrs)
}

标签: csvgo

解决方案


csv ReadAll() 函数返回行切片,其中行是列切片。
我们可以循环遍历行,在一行中,再次循环遍历列并比较每一列的值。

这是打印所有具有差异的行及其行号的代码。

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("sms_in_max.csv")
    if err != nil {
        fmt.Println(err)
    }
    reader := csv.NewReader(file)
    records, _ := reader.ReadAll()
    fmt.Println(records)
    file2, err := os.Open("sms_out.csv")
    if err != nil {
        fmt.Println(err)
    }
    reader2 := csv.NewReader(file2)
    records2, _ := reader2.ReadAll()
    fmt.Println(records2)
    // allrs := reflect.DeepEqual(records, records2)
    // fmt.Println(allrs)

    // Prints lines at which there is difference
    for i := range records {
        diff := false
        for j := range records[i] {
            if records[i][j] != records2[i][j] {
                diff = true
                break
            }
        }
        if diff {
            fmt.Printf("Line %d: %v, %v\n", i+1, records[i], records2[i])
        }
    }
}

推荐阅读