Как реализовать функцию импорта данных с 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])
}