我正在编写一个程序,它应该读取文件的内容并从中提取数据。我尝试使用fmt.Fscanf()逐行扫描内容,但由于某些原因,我无法使它正常工作。整行只扫描到第一个字符串参数。我在这里做错什么了?
我假设它不起作用,因为这些值不是由空格分隔的,但是我找不到解决方案。感谢您的帮助和专业知识!
20220105|AA|1051302|4323|3132468|B,Q,N
20220105|AAA|61|0|62|Q
20220105|AAAU|19404|0|57137|Q,N
20220105|AAC|35524|0|39861|Q,N
20220105|AAC/WS|1180|0|2000|N
20220105|AACG|1805439|32577|3484265|B,Q,Nfunc main() {
file, err := os.Open("./CNMSshvol20220105.txt")
if err != nil{
log.Fatal(err)
}
defer file.Close()
var m map[string][]int
m = make(map[string][]int)
for{
row := ""
date := ""
symbol := ""
shortVolume := 0
shortExemptVolume := 0
totalVolume := 0
markets := ""
//Date|Symbol|ShortVolume|ShortExemptVolume|TotalVolume|Market
var n int
n, err := fmt.Fscanf(file, "%s\n", &row)
fmt.Sscanf(row, "%s|%s|%d|%d|%d|%s", &date, &symbol, &shortVolume, &shortExemptVolume, &totalVolume,&markets)
fmt.Println(date)
if n == 0 || err != nil{
log.Fatalf("Fscanf: %v\n", err)
break
}
fmt.Println(symbol, shortVolume, shortExemptVolume, totalVolume)
m[strings.ToLower(symbol)] = append(m[strings.ToLower(symbol)],shortVolume)
m[strings.ToLower(symbol)] = append(m[strings.ToLower(symbol)],shortExemptVolume)
m[strings.ToLower(symbol)] = append(m[strings.ToLower(symbol)],totalVolume)
}
//Retrieve values if the key exists
for{
fmt.Println("\n\n\n\nEnter ticker to retrieve short volume information.")
var s string
fmt.Scanf("%s",&s)
data, ok := m[strings.ToLower(s)]
if !ok{
fmt.Println("Not Found.")
continue
}
for _, value := range data{
fmt.Println(value)
}
}
}```发布于 2022-01-07 05:34:32
space-separated扫描参数字符串,将连续的fmt.Sscanf documentation值存储到由格式确定的连续参数中。
|字符不是空格,每个格式占位符都独立于任何其他格式占位符,因此%s|并不意味着匹配到第一个|的任何字符串,而是匹配不包括空格的任何字符串,然后是|。
您可以逐行处理文件,例如使用strings.Split() by |拆分每一行,然后根据需要将值解析为变量:
row := "20220105|AACG|1805439|32577|3484265|B,Q,N"
tokens := strings.Split(row, "|")
if len(tokens) != 6 {
log.Fatal("Bad line in file...")
}
// Do appropriate conversions...
date, err := strconv.Atoi(tokens[0])
if err != nil {
log.Fatal("first token is not an integer")
}
symbol := tokens[1]
// ...
fmt.Println(date, symbol)或者,正如Volker在他的评论中指出的,您可以使用package encoding/csv并将其Reader Comma (分隔符)选项设置为|
f := `20220105|AA|1051302|4323|3132468|B,Q,N
20220105|AAA|61|0|62|Q`
r := csv.NewReader(strings.NewReader(f))
r.Comma = '|'
data, err := r.ReadAll()
if err != nil {
log.Fatal(err)
}
// Process data, do appropriate conversions
fmt.Print(data)https://stackoverflow.com/questions/70616780
复制相似问题