英文:
How to write data to a slice of structs
问题
首先,你需要在循环中创建一个新的row
结构体,并将其添加到parsedData
切片中。你可以使用append
函数来实现这一点。以下是你可以尝试的修改:
for i1, v1 := range data {
// ignore the first line because it is the header
if i1 == 0 {
continue
}
lines := strings.Fields(v1)
// create a new row struct
newRow := row{}
for i2, v2 := range lines {
switch i2 {
case 0:
newRow.cpf = cleanStrings(v2)
case 1:
newRow.private = strToBool(v2)
case 2:
newRow.incompleto = strToBool(v2)
case 3:
newRow.ultCompra = v2
case 4:
newRow.ticketMedio = strToFloat(v2)
case 5:
newRow.ticketUltimo = strToFloat(v2)
case 6:
newRow.lojaMaisFreq = cleanStrings(v2)
case 7:
newRow.lojaUltCompra = cleanStrings(v2)
}
}
// append the new row to parsedData
parsedData = append(parsedData, newRow)
}
这样,每次循环时都会创建一个新的row
结构体,并将其添加到parsedData
切片中。这样你就可以将所有数据放入parsedData
中的结构体切片了。
英文:
First, the raw input data:
CPF PRIVATE INCOMPLETO DATA DA ÚLTIMA COMPRA TICKET MÉDIO TICKET DA ÚLTIMA COMPRA LOJA MAIS FREQUÊNTE LOJA DA ÚLTIMA COMPRA
041.091.641-25 0 0 NULL NULL NULL NULL NULL
058.189.421-98 0 0 NULL NULL NULL NULL NULL
769.013.439-49 0 0 NULL NULL NULL NULL NULL
I have this struct:
type row struct {
cpf string
private bool
incompleto bool
ultCompra string
ticketMedio float64
ticketUltimo float64
lojaMaisFreq string
lojaUltCompra string
}
I created a slice of it:
var parsedData []row
And i want to write data in a for range loop. The data comes from a txt and i parsed it.
I did a for range loop with with strings.Field like this:
for i1, v1 := range data {
// ignore the first line because it is the header
if i1 == 0 {
continue
}
lines := strings.Fields(v1)
The data is now a [][]string like this:
[004.350.709-32 0 0 2013-05-27 599,60 599,60 79.379.491/0008-50 79.379.491/0008-50]
[152.110.128-01 0 0 2013-05-27 449,90 449,90 79.379.491/0008-50 79.379.491/0008-50]
[067.737.339-28 0 0 2013-05-27 299,90 299,90 79.379.491/0008-50 79.379.491/0008-50]
So i iterate over it in a for range loop:
for i2, v2 := range data {
fmt.Println(i2, "-", v2)
}
Which gives me this:
0 - 004.350.709-32
1 - 0
2 - 0
3 - 2013-05-27
4 - 599,60
5 - 599,60
6 - 79.379.491/0008-50
7 - 79.379.491/0008-50
After this i created functions to treat all the data to be compatible with each field in the struct.
Now... How do i put everything into the slice of structs? Here is what i'm doing:
// using the index of the first loop
newIndex := i1 - 1 // since it ignores 0 which is the header
switch i2 {
case 0:
parsedData[newIndex].cpf = cleanStrings(v2)
case 1:
parsedData[newIndex].private = strToBool(v2)
case 2:
parsedData[newIndex].incompleto = strToBool(v2)
case 3:
parsedData[newIndex].ultCompra = v2
case 4:
parsedData[newIndex].ticketMedio = strToFloat(v2)
case 5:
parsedData[newIndex].ticketUltimo = strToFloat(v2)
case 6:
parsedData[newIndex].lojaMaisFreq = cleanStrings(v2)
case 7:
parsedData[newIndex].lojaUltCompra = cleanStrings(v2)
}
But this is wrong. It gives me index out of range. Since it is an empty slice I probably have to append to it instead, but i can't wrap my head around how to do this.
I have to create a new row struct for every loop?
答案1
得分: 1
所以,我刚刚弄清楚了。我用len函数得到了txt文件的行数,并进行了切片:
parsedData := make([]row, len(data)-1)
for i1, v1 := range data {
if i1 == 0 {
continue
}
lines := strings.Fields(v1)
for i2, v2 := range lines {
newIndex := i1 - 1
switch i2 {
case 0:
parsedData[newIndex].cpf = cleanStrings(v2)
case 1:
parsedData[newIndex].private = strToBool(v2)
case 2:
parsedData[newIndex].incompleto = strToBool(v2)
case 3:
parsedData[newIndex].ultCompra = v2
case 4:
parsedData[newIndex].ticketMedio = strToFloat(v2)
case 5:
parsedData[newIndex].ticketUltimo = strToFloat(v2)
case 6:
parsedData[newIndex].lojaMaisFreq = cleanStrings(v2)
case 7:
parsedData[newIndex].lojaUltCompra = cleanStrings(v2)
}
}
}
return parsedData
现在一切都正常了!
英文:
So, i just figured out. I got the number of lines of the txt file with len and made the slice:
parsedData := make([]row, len(data)-1)
for i1, v1 := range data {
if i1 == 0 {
continue
}
lines := strings.Fields(v1)
for i2, v2 := range lines {
newIndex := i1 - 1
switch i2 {
case 0:
parsedData[newIndex].cpf = cleanStrings(v2)
case 1:
parsedData[newIndex].private = strToBool(v2)
case 2:
parsedData[newIndex].incompleto = strToBool(v2)
case 3:
parsedData[newIndex].ultCompra = v2
case 4:
parsedData[newIndex].ticketMedio = strToFloat(v2)
case 5:
parsedData[newIndex].ticketUltimo = strToFloat(v2)
case 6:
parsedData[newIndex].lojaMaisFreq = cleanStrings(v2)
case 7:
parsedData[newIndex].lojaUltCompra = cleanStrings(v2)
}
}
}
return parsedData
And now everything works!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论