比较CSV文件并得出差异的结论。

huangapple go评论117阅读模式
英文:

Compare CSV and conclusion of differences

问题

我开始编写一个程序来比较两个CSV文件。在阅读文档后,我找到了一个解决方案,但我不知道如何打印第二个文件中的差异,因为该函数只返回true/false。

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "reflect"
  7. )
  8. func main() {
  9. file, err := os.Open("sms_in_max.csv")
  10. if err != nil {
  11. fmt.Println(err)
  12. }
  13. reader := csv.NewReader(file)
  14. records, _ := reader.ReadAll()
  15. fmt.Println(records)
  16. file2, err := os.Open("sms_out.csv")
  17. if err != nil {
  18. fmt.Println(err)
  19. }
  20. reader2 := csv.NewReader(file2)
  21. records2, _ := reader2.ReadAll()
  22. fmt.Println(records2)
  23. allrs := reflect.DeepEqual(records, records2)
  24. fmt.Println(allrs)
  25. }

请注意,这只是一个比较两个CSV文件并打印差异的示例程序。你可能需要进一步处理差异并进行适当的输出。

英文:

I started writing a program to compare two CSV files. After reading the documentation, I found a solution for I can't figure out how to print the differences from the second file since the function returns true/false

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "reflect"
  7. )
  8. func main() {
  9. file, err := os.Open("sms_in_max.csv")
  10. if err != nil {
  11. fmt.Println(err)
  12. }
  13. reader := csv.NewReader(file)
  14. records, _ := reader.ReadAll()
  15. fmt.Println(records)
  16. file2, err := os.Open("sms_out.csv")
  17. if err != nil {
  18. fmt.Println(err)
  19. }
  20. reader2 := csv.NewReader(file2)
  21. records2, _ := reader2.ReadAll()
  22. fmt.Println(records2)
  23. allrs :=reflect.DeepEqual(records, records2)
  24. fmt.Println(allrs)
  25. }

答案1

得分: 1

csv的ReadAll()函数返回行的切片,其中每一行都是列的切片。
我们可以循环遍历行,在每一行中再循环遍历列,并比较每一列的值。
以下是打印所有有差异的行及其行号的代码。

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. )
  7. func main() {
  8. file, err := os.Open("sms_in_max.csv")
  9. if err != nil {
  10. fmt.Println(err)
  11. }
  12. reader := csv.NewReader(file)
  13. records, _ := reader.ReadAll()
  14. fmt.Println(records)
  15. file2, err := os.Open("sms_out.csv")
  16. if err != nil {
  17. fmt.Println(err)
  18. }
  19. reader2 := csv.NewReader(file2)
  20. records2, _ := reader2.ReadAll()
  21. fmt.Println(records2)
  22. // 打印有差异的行
  23. for i := range records {
  24. diff := false
  25. for j := range records[i] {
  26. if records[i][j] != records2[i][j] {
  27. diff = true
  28. break
  29. }
  30. }
  31. if diff {
  32. fmt.Printf("第 %d 行: %v, %v\n", i+1, records[i], records2[i])
  33. }
  34. }
  35. }
英文:

The csv ReadAll() function returns slice of rows, where row is a slice of columns.<br>
We can loop over the rows, and within a row, again loop over the columns and compare each column value.<br><br>
Here is the code that prints all lines that have differences alongwith their line numbers.

  1. package main
  2. import (
  3. &quot;encoding/csv&quot;
  4. &quot;fmt&quot;
  5. &quot;os&quot;
  6. )
  7. func main() {
  8. file, err := os.Open(&quot;sms_in_max.csv&quot;)
  9. if err != nil {
  10. fmt.Println(err)
  11. }
  12. reader := csv.NewReader(file)
  13. records, _ := reader.ReadAll()
  14. fmt.Println(records)
  15. file2, err := os.Open(&quot;sms_out.csv&quot;)
  16. if err != nil {
  17. fmt.Println(err)
  18. }
  19. reader2 := csv.NewReader(file2)
  20. records2, _ := reader2.ReadAll()
  21. fmt.Println(records2)
  22. // allrs := reflect.DeepEqual(records, records2)
  23. // fmt.Println(allrs)
  24. // Prints lines at which there is difference
  25. for i := range records {
  26. diff := false
  27. for j := range records[i] {
  28. if records[i][j] != records2[i][j] {
  29. diff = true
  30. break
  31. }
  32. }
  33. if diff {
  34. fmt.Printf(&quot;Line %d: %v, %v\n&quot;, i+1, records[i], records2[i])
  35. }
  36. }
  37. }

huangapple
  • 本文由 发表于 2021年8月17日 15:58:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/68813652.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定