String golang扫描仪读取,直到读卡器结束

String golang扫描仪读取,直到读卡器结束,string,parsing,go,String,Parsing,Go,我在StringReader上有一个bufio扫描仪。当我到达扫描仪输出的某一行后,我想一直读到读卡器的末尾。除了注释代码之外,有没有其他更简单的方法来实现这一点 s := `1 2 3 4 5 6 7` beyond5 := "" scanner := bufio.NewScanner(strings.NewReader(s)) for scanner.Scan() { if strings.Contains(scanner.Text(), "5") { // Rea

我在StringReader上有一个bufio扫描仪。当我到达扫描仪输出的某一行后,我想一直读到读卡器的末尾。除了注释代码之外,有没有其他更简单的方法来实现这一点

s := `1
2
3
4
5
6
7`

beyond5 := ""
scanner := bufio.NewScanner(strings.NewReader(s))
for scanner.Scan() {
    if strings.Contains(scanner.Text(), "5") {
        // Read all lines until EOF from scanner
        // and store in beyond5
        // for scanner.Scan() {
        //  beyond5 += scanner.Text()
        //  beyond5 += "\n"
        // }
        break
    }
}

log.Println(beyond5)
这是你想要的吗?:-)

更新:我的解决方案与@abhink的解决方案类似,但它们是不同的解决方案

我曾经使用过,这个方法设置了它的split(private)属性。这是我的实现:

var canPass bool

func mySplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
    for pos, value := range data {

        if (value < '6' && !canPass) || (value < '0' || value > '9') {
            continue
        }

        canPass = true
        return pos+1, data[pos : pos + 1], nil
    }

    return 0, nil, nil
}
使用
scanner.Scan()

输出:

6
7


我希望这是您正在寻找的解决方案:-)

使用扫描仪似乎根本不可能进行这种操作。我们只需要使用bufio阅读器。代码是:

s := `1
2
3
4
5
6
7`

beyond5 := ""
r := strings.NewReader(s)
reader := bufio.NewReader(r)
for {
    line, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }
    if strings.Contains(line, "5") {
        b, _ := ioutil.ReadAll(reader)
        beyond5 = string(b)
        break
    }
}

log.Println(beyond5)

不,这不是我想要的。我想打印“6\n7”。但更重要的是,我想知道是否有办法从扫描仪的SEEK_CUR位置读取EOF。@SankarP,我已经更新了解决方案。请参阅更新您可能可以使用自定义拆分函数:但是,这仍然可能无法执行完整的seek to EOF,并且它不再在
\n
上拆分。
for scanner.Scan() {
        beyond5 += scanner.Text() + "\n"
}
6
7
s := `1
2
3
4
5
6
7`

beyond5 := ""
r := strings.NewReader(s)
reader := bufio.NewReader(r)
for {
    line, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }
    if strings.Contains(line, "5") {
        b, _ := ioutil.ReadAll(reader)
        beyond5 = string(b)
        break
    }
}

log.Println(beyond5)