【问题标题】:How on the place of empty space in the csv file the empty string value is added in database如何在 csv 文件中的空白处将空字符串值添加到数据库中
【发布时间】:2018-06-27 11:15:30
【问题描述】:

我的 csv 文件有这样的用户数据:

 firstname|lastname|Email| other fields are empty
          |        |     |
          |        |     |
          |        |     |
          |        |     |

我使用的代码是:

 package main

import (
 "encoding/csv"
 "gopkg.in/mgo.v2"
 "io"
 "log"
 "os"
)

type Mongo struct {
  // Id          int    `json:"_id" bson:"_id"`
  FirstName   string `json:"first_name,omitempty" bson:"first_name,omitempty"`
  LastName    string `json:"last_name,omitempty" bson:"last_name,omitempty"`
  Email       string `json:"email,omitempty" bson:"email,omitempty"`
  PhoneNumber string `json:"phone_number,omitempty" bson:"phone_number,omitempty"`
  Gender      string `json:"gender,omitempty" bson:"gender,omitempty"`
  Address     string `json:"address,omitempty" bson:"address,omitempty"`
  Apartment   string `json:"apartment,omitempty" bson:"apartment,omitempty"`
  Description string `json:"description,omitempty" bson:"description,omitempty"`
 }

func main() {

 session, err := mgo.Dial("localhost")
 if err != nil {
    panic(err)
 }

 defer session.Close()
 session.SetMode(mgo.Monotonic, true)

 c := session.DB("Import_Users").C("users")

 file, err := os.Open("customers.csv")

 if err != nil {
    panic(err)
 }
 defer file.Close()

 reader := csv.NewReader(file)

 for {
    record, err := reader.Read()
    if err == io.EOF {
        break
    } else if err != nil {
        panic(err)
    }

    err = c.Insert(&Mongo{record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7]})

    if err != nil {
        panic(err)
    }
    log.Printf("%#v", record)
 }
}

运行时出现错误:

错误:- 恐慌:运行时错误:索引超出范围

goroutine 1 [运行中]: main.main() /home/iron/go/src/go-training/How_to_load_csv_file/main.go:53 +0x830 退出状态2

我该如何解决这个错误?

【问题讨论】:

  • @Capricorn 我不明白我将如何在我的代码中编写它,你能解释一下吗
  • 尝试打印插入到mongo之前的记录数,然后提供record切片的索引。正如我所见,您的代码中只有一个错误,那就是您提供了一个不存在的record slice 的索引。
  • record 没有 8 个元素,它的长度将匹配 csv 行中的列数。因此,在record 的范围之外进行索引会导致运行时错误。一个快速的解决方法是执行row := make([]string, 8); copy(row, record),然后使用row 构造Mongo
  • @Himanshu 你能告诉我错误在哪里

标签: go import-csv


【解决方案1】:

确保您有record[0]record[7] 的切片元素。添加空的填充元素。例如,

reader := csv.NewReader(file)
padding := make([]string, 8)  // 0 thru 7
for {
    record, err := reader.Read()
    if err == io.EOF {
        break
    } else if err != nil {
        panic(err)
    }
    record = append(record, padding...)
    err = c.Insert(&Mongo{record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7]})

    if err != nil {
        panic(err)
    }
    log.Printf("%#v", record)
}

【讨论】:

  • 现在还可以,但是如果用户想在其中添加新字段,那么它将需要7 更多,然后我们将如何做。
  • 如果用户将在 csv 文件中创建一个新字段,那么我们必须将这个 padding := make([]string, 8) 更改为 9。我是对的?
  • @ansh:填充分配的长度应该比引用的最大元素索引多一倍,在这种情况下,record[7]8 = 7 + 1。如果添加record[8],则分配9 = 8 + 1
  • 还有一件事,如果该字段为空,那么它不会保存到数据库中,对吧?
  • @ansh:你有 omitempty 用于 Mongo struct 字段,应该在写入时省略任何空字段。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2015-11-06
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多