2016-07-26 9 views
2

Ich habe einen Bufio-Scanner auf einem StringReader. Nachdem ich eine bestimmte Zeile am Scannerausgang erreicht habe, möchte ich bis zum Ende des Lesers lesen. Gibt es eine Möglichkeit, dies auf eine einfachere Art und Weise als den kommentierten Code zu erreichen?Golang-Scanner bis Ende des Lesers lesen

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) 
+2

Sie können vielleicht eine benutzerdefinierte Split-Funktion verwenden: https://play.golang.org/p/sr1pUIR3NC Dies ist jedoch noch nicht vollständig EOF suchen durchführen kann und es nicht gespalten auf '\ n' nicht mehr. – abhink

Antwort

0

Es scheint so eine Operation ist überhaupt nicht möglich mit dem Scanner. Wir müssen nur den Bufio-Leser verwenden. Der Code ist:

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) 
0

Wollen Sie das? :-)

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

    var beyond5 string 

    if strings.Contains(s, "5") { 
     scanner := bufio.NewScanner(strings.NewReader(s)) 
     for scanner.Scan() { 
      beyond5 += scanner.Text() 
     } 
    } 

    beyond5 += "\n" 

    log.Println(beyond5) 

UPDATE: Meine Lösung ist ähnlich @ abhink-Lösung, aber sie sind verschiedene Lösungen

I Split method verwendet haben, diese Methode gesetzt Split (privat) Eigenschaft, die es SplitFunc type . Und das ist meine Implementierung:

Jetzt müssen Sie Split-Methode verwenden, senden Sie es als Parameter mySplit.

scanner.Split(mySplit) 

Und Sie tun ein einfaches für mit scanner.Scan()

for scanner.Scan() { 
     beyond5 += scanner.Text() + "\n" 
} 

Ausgang:

6 
7 

Playground

Ich hoffe, es ist die Lösung, die Sie gesucht haben :-)

+0

Nein. Das ist nicht was ich will. Ich möchte, dass "6 \ n7" gedruckt wird. Aber was noch wichtiger ist, ich möchte wissen, ob es eine Möglichkeit gibt, EOF von einem Scanner aus seiner SEEK_CUR-Position zu lesen. –

+0

@SankarP, ich habe meine Lösung aktualisiert. Siehe ** UPDATE ** –