【发布时间】:2021-04-25 23:11:41
【问题描述】:
我正在解析一个警察记录 csv 文件。文件中多次出现同一日期。我有一个日期映射,它创建一个新的日期键,并分配给它的 DateData 类型。
DateDate 现在只有一个 Count 键。每次循环中再次出现相同的日期时,该键都会增加。现在我只能增加一次。即使有几十个相同的日期,计数也会从 1 变为 2。
为了清晰起见,这是我使用较短版本的 csv 文件得到的输出。
user@MacBook-Pro-3 criminal-record-parser % go run main.go
Does not exist yet
{1}
{2}
{2}
{2}
{2}
计数应该增加到总数为 5,但它只会增加一次 这是我在主包中的所有代码:
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
"strings"
)
type Report struct {
Date string `json:"date"`
Address string `json:"address"`
District string `json:"district"`
Beat string `json:"beat"`
Grid string `json:"grid"`
Crimedesc string `json:"crimedesc"`
UCRCode string `json:"ucr_ncic_code"`
Lat string `json:"latitude"`
Lon string `json:"longitude"`
}
type DateData struct {
Count int
}
func main() {
reports := CreateReport()
var dates = make(map[string]DateData)
for _, report := range reports {
dateIndex := strings.LastIndex(report.Date, "/")
date := report.Date[0 : dateIndex+3]
val, ok := dates[date]
if !ok {
fmt.Println("Does not exist yet")
dates[date] = DateData{
Count: 1,
}
}
val.Count += 1
fmt.Println(val)
}
fmt.Println("dates slice", dates)
}
func CreateReport() []Report {
csvFile, err := os.Open("./files/sacramento-test.csv")
if err != nil {
log.Fatal("error opeining file", err)
}
defer csvFile.Close()
reader := csv.NewReader(csvFile)
var reports []Report
for {
line, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
log.Fatal("error reading file", err)
}
reports = append(reports, Report{
Date: line[0],
Address: line[1],
District: line[2],
Beat: line[3],
Grid: line[4],
Crimedesc: line[5],
UCRCode: line[6],
Lat: line[7],
Lon: line[8],
})
}
return reports
}
为什么我的 DateData 结构的 Count 值只增加一次。改变值的另一种方法是什么
当我尝试以这种方式更改 Count 值时:dates[date].Count += 1
我收到此错误:
cannot assign to struct field dates[date].Count in mapcompilerUnaddressableFieldAssign
它正在解析的 CSV 文件
1/1/06 0:00,3108 OCCIDENTAL DR,3,3C ,1115,10851(A)VC TAKE VEH W/O OWNER,2404,38.55042047,-121.3914158
1/1/06 0:00,2082 EXPEDITION WAY,5,5A ,1512,459 PC BURGLARY RESIDENCE,2204,38.47350069,-121.4901858
1/1/06 0:00,4 PALEN CT,2,2A ,212,10851(A)VC TAKE VEH W/O OWNER,2404,38.65784584,-121.4621009
1/1/06 0:00,22 BECKFORD CT,6,6C ,1443,476 PC PASS FICTICIOUS CHECK,2501,38.50677377,-121.4269508
1/1/06 0:00,3421 AUBURN BLVD,2,2A ,508,459 PC BURGLARY-UNSPECIFIED,2299,38.6374478,-121.3846125
【问题讨论】:
-
没有直接回答你的问题,但是为什么你需要一个只有一个字段的结构类型来保持计数?为什么不在
main()函数中使用map[string]int类型来保持计数? -
您正在更新计数的副本 - 但没有分配回地图。
-
@jidicula 我最终会添加更多字段