Как реализовать функцию импорта данных с Golang?

У меня есть 2 метода, которые я использую для GET а также POST, Первый из них:

 var Join map[string]int

func MapTheFields(c *gin.Context) {
 var data []string
 //Open the csv file
 csvFile, _ := os.Open("customers.csv")
 reader := csv.NewReader(csvFile)
 line, _ := reader.ReadAll()
 for i := 0; i < len(line[0]); i++ {
     Join = map[string]int{
         line[0][i]: i,
     }
     data = append(data, line[0][i])
 }
 GetSuccessResponse(c, "The Mappings are:", data)

 }

Второй тоже похож на первый. Он просто сохраняет значения в базе данных.

Проблема, с которой я столкнулся, заключается в том, что мне нужно сопоставить поля, которые я получаю из файла CSV, с полями в моем проекте, чтобы сделать это, я создал карту с именем Join как показано выше, и я получаю доступ к значению строки во второй функции как

line[i][Join["Last Name"]]

Но я получаю значение Join["Last Name"] как 0 хотя это ценность 1и где бы я ни использовал соединение в качестве индекса, значение равно нулю, и я всегда получаю только первые 4 значения, а затем ошибку индекса за пределами границ.

Код отдыха:

func ImportCustomerData(c *gin.Context) {
//Open the csv file
csvFile, _ := os.Open("customers.csv")
reader := csv.NewReader(csvFile)
var (
    user      models.User
    customer  models.Customer
    address   models.UserAddress
    addresses []models.UserAddress
    people    []models.Customer
    users     []models.User
)

line, _ := reader.ReadAll()
for i := 1; i < len(line[0]); i++ {

    //Initialize address details

    address.Address = line[i][Join["address"]]
    address.City = line[i][Join["City"]]
    address.State = line[i][Join["State"]]
    address.Zipcode = line[i][Join["Postal Code"]]

    savedAddress := SaveNewAddress(address, merchantDb)

    //Initalize user details
    user.FirstName = line[i][Join["First Name"]]
    user.LastName = line[i][Join["Last Name"]]
    user.CompanyName = line[i][Join["Company Name"]]
    user.EmailId = line[i][Join["Email"]]
    user.PhoneNumber = line[i][Join["Phone"]]
  }
}

Выход первой функции почтальона:{ "response": { "code": 200, "api_status": 1, "message": "The Mappings are:", "data": [ "First Name", "Last Name", "Company Name", "Email", "Address", "City", "State", "Postal Code", "Phone", "Date Created", "Stripe ID", "Date of First Booking", "Date of Last Booking", "Frequency of Last Booking", "Date of Next Booking", "Notes", "Customer ID" ] } }

Где я допустил ошибку?

1 ответ

Решение

Вы назначаете новую карту каждый раз в MapTheFields():

 for i := 0; i < len(line[0]); i++ {
     Join = map[string]int{
         line[0][i]: i,
     }
     data = append(data, line[0][i])
 }

Join карта типа, должна быть выделена первой, объявить Join следующим образом:

Join = make(map[string]int) //declaration can be global

Заменить фрагмент кода в MapTheFields() с этим:

 for i := 0; i < len(line[0]); i++ {
     Join[line[0][i]] = i
     data = append(data, line[0][i])
 }
Другие вопросы по тегам