我一直在想如何实现我原本以为是一个简单的程序。 我有一个文本文件的所有用'$$'分隔的文本文件如何使用Golang自定义扫描器字符串文字并扩展内存以将整个文件加载到内存中?
我希望程序解析报价文件并随机选择3个引号来显示和标准输出。
该文件中有1022个引号。
当我试图分裂文件,我得到这个错误: 缺少“
我似乎无法弄清楚如何分配$$用于字符串,我不断收到:
失踪“
这是自定义扫描:
onDollarSign := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
for i := 0; i < len(data); i++ {
//if data[i] == "$$" { # this is what I did originally
//if data[i:i+2] == "$$" { # (mismatched types []byte and string)
//if data[i:i+2] == `$$` { # throws (mismatched types []byte and string)
// below throws syntax error: unexpected $ AND missing '
if data[1:i+2] == '$$' {
return i + 1, data[:i], nil
}
}
字符串字面工作正常,如果我只用一个$
。
由于某种原因只有71个报价被加载到报价切片中。我不知道如何扩大。允许所有1022个引号存储在内存中。
我一直有一个非常困难的时间试图找出如何做到这一点。这就是我现在所拥有的:
package main
import (
"bufio"
"fmt"
"log"
"math/rand"
"os"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) // Try changing this number!
quote_file, err := os.Open("/Users/bryan/Dropbox/quotes_file.txt")
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(quote_file)
// define split function
onDollarSign := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
for i := 0; i < len(data); i++ {
if data[i] == '$$' {
return i + 1, data[:i], nil
}
}
fmt.Print(data)
return 0, data, bufio.ErrFinalToken
}
scanner.Split(onDollarSign)
var quotes []string
// I think this will scan the file and append all the parsed quotes into quotes
for scanner.Scan() {
quotes = append(quotes, scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
fmt.Print(len(quotes))
fmt.Println("quote 1:", quotes[rand.Intn(len(quotes))])
fmt.Println("quote 2:", quotes[rand.Intn(len(quotes))])
fmt.Println("quote 3:", quotes[rand.Intn(len(quotes))])
}
因此,只有在您使用部分文件的情况下才能使用Scanner?在这种情况下,如果没有完整地读取文件,您将如何计算文件中的引号总数? – BryanWheelock
如果您不知道前面的引用数量,您别无选择,只能阅读整个文件。在这种情况下,使用扫描仪比啜泣文件和分割字节更复杂。 – Peter