2016-07-26 6 views
2

私はStringReader上にbufioスキャナを持っています。スキャナ出力のある行に達したら、リーダーの最後まで読みたい。コメント付きコード以外の簡単な方法でこれを達成する方法はありますか?golangスキャナ読者の最後まで読んでください

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

あなたはおそらくカスタムスプリット機能を使用することができます。https://play.golang.org/p/sr1pUIR3NCは はしかし、これはまだ完全に実行しない場合がありEOFまでシークし、それが分割されていません'\ n'でもう一度。 – abhink

答えて

0

このような操作はスキャナでは全くできないようです。私たちは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) 
0

これは適切ですか? :-)

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:私のソリューションは、しかし、彼らは私がSplit method使用している

異なるソリューションがあり、それがSplitFunc typeである。この方法を設定スプリット(プライベート)プロパティ@ abhinkのソリューションに似ています。これは私の実装です:

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 
} 

これで、Splitメソッドを使用してmySplitをパラメータとして送信する必要があります。

scanner.Split(mySplit) 

そして、あなたがのために、簡単な操作を行うとscanner.Scan()

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

出力:

6 
7 

Playground

私はそれはあなたが:-)を探していたソリューションであると思います

+0

いいえ、これは私が欲しいものではありません。私は "6 \ n7"を印刷したい。しかしもっと重要なのは、スキャナからSEOFKURの位置までEOFまで読む方法があるかどうかを知りたいのです。 –

+0

@SankarP、私は私の解決策を更新しました。 ** UPDATE **を参照してください –

関連する問題