Skip to content

Instantly share code, notes, and snippets.

@BooookStore
Created November 17, 2017 12:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BooookStore/5b5db966a04be82e2c06da61486cb05a to your computer and use it in GitHub Desktop.
Save BooookStore/5b5db966a04be82e2c06da61486cb05a to your computer and use it in GitHub Desktop.
Go言語のScannerの使い方
// デフォルトのsplitFuncを使用して行単位で読み込み
func readLineByScanner() {
reader := strings.NewReader("1234\n5678")
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
// 標準で用意されているScanWords関数を利用して、単語単位で読み込み
func readWordByScanner() {
reader := strings.NewReader("abc efg\nhijk lmn")
scanner := bufio.NewScanner(reader)
scanner.Split(bufio.ScanWords)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
// 独自のsplitFuncを定義して、数値を読み込み
// 数値として変換できない場合はエラー
func readCustomScanner() {
scanner := bufio.NewScanner(strings.NewReader("1234 5678 1234567891234567890"))
split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
advance, token, err = bufio.ScanWords(data, atEOF)
if err == nil && token != nil {
_, err = strconv.ParseInt(string(token), 10, 32)
}
return
}
scanner.Split(split)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
}
}
// 独自のsplitFunc関数を定義して、コンまで区切られている単語ごとに読み込み
func readCustomScannerCommaSeparated() {
scanner := bufio.NewScanner(strings.NewReader("1,2,3,4"))
onComma := 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
}
}
return 0, data, bufio.ErrFinalToken
}
scanner.Split(onComma)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment