golang 从Go中的SDIN读取大文本数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 从Go中的SDIN读取大文本数据相关的知识,希望对你有一定的参考价值。

package main
import "fmt"
import "bufio"
import "os"

func main() {
    f, _ := os.Create("outputgo.txt")
    reader := bufio.NewReader(os.Stdin)
    for  {
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("%s", line)
            return
        }
        f.WriteString(line)
    }
}

//------------
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		fmt.Println(scanner.Text()) // Println will add back the final '\n'
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading standard input:", err)
	}
}

//-----------------
// Create a buffer to hold the stream data
data := make([]byte, 5000)

// Read data from stdin in a loop
for {
    _, err = os.Stdin.Read(data)
    if err != nil {
        panic(err)
    }

    index := bytes.Index(data, []byte("\n"))
    data = data[:index]

    var myStruct MyStruct
    err = json.Unmarshal(data, &myStruct)
    if err != nil {
        panic(err)
    }

    //(Do something with myStruct)
}

//-----------------

import "os"
import "log"
import "bufio"

func main() {
    reader := bufio.NewReader(os.Stdin)

    for {
        line, err := reader.ReadString('\n')

        if err != nil {
            // You may check here if err == io.EOF
            break
        }

        log.Println(line)
    }
}

//---------------

package main

import "os"
import "log"
import "io/ioutil"

func main() {
    bytes, err := ioutil.ReadAll(os.Stdin)

    log.Println(err, string(bytes))
}

//----------------




Go语言中的fmt.Scan使用说明

在go语言中如果想获取用户输入,会用到Scan方法。scan在go语言中有很多中,今天介绍一下他们的使用方法和不同点。

和print类似,scan也分为三大类:

  • Scan、Scanf和Scanln: 从标准输入os.Stdin读取文本(从终端获取数据)
  • Fscan、Fscanf、Fscanln: 从指定的io.Reader接口读取文本(通用)
  • Sscan、Sscanf、Sscanln: 从一个参数字符串读取文本(从字符串string获取数据)

Scan:

语法: func Scan(a ...interface{}) (n int, err error)
例:
func main() {
          var str string
          fmt.Printf("请输入内容:")
          fmt.Scan(&str)
          fmt.Printf("str: %s",str)
}
/* scan将碰到第一个空格或换行符之前的内容赋值给变量。如果
scan中有多个变量,变量值用空格或换行符分割。所以换行和空
格是不能存储到变量内的。
*/

Scanf:

语法:func Scanf(format string, a ...interface{}) (n int, err error)
例:
func main() {
    var (
        name string
        age int
    )   
    fmt.Printf("请输入内容:")
    fmt.Scanf("name:%s age:%d",&name,&age)
    fmt.Printf("n: %s, a:%d",name,age)
}   

Scanln:

语法:func Scanln(a ...interface{}) (n int, err error)
例:
func main() {
    var str string
    fmt.Printf("请输入内容:")
    fmt.Scanln(&str)
    fmt.Printf("str: %s",str)
}       
//Scanln类似Scan,但在遇到换行符时会立刻停止扫描。

总结:Scan和Scanln基本相同,唯一区别是当读取多个变量当时候,遇到换行符Scanln会直接结束,未读到输入值的变量为零值;Scan会等待,直到输入的值满足参数的个数后再遇到换行符才会结束。

Sscan,Sscanf,Sscanln

语法
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
例:
func main() {
    var i1,i2 int
    fmt.Sscan("100
200",&i1,&i2)
    fmt.Printf("int1: %d,int2: %d", i1,i2)
}
//用法和scan基本一样,只是改成从字符串获取数据

Fscan、Fscanf、Fscanln:

func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
/*
只要对象实现了read方法(满足io.Reader接口),就能使用此方法。上面提到的Scan,Scanf,Scanln和Sscan,Sscanf,Sscanln都是有此方法封装而来。
使用方法和上面相同,只不过要多指定一个实现read方法的源。
*/

因为上面的方法都是以空格作为分割符的,所以不能获取含有空格的数据。如果有这方面的需求,可以使用bufio来实现。如下:

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("输入信息:")
    input, _ := reader.ReadString(‘
‘)
    fmt.Printf("n: %s",input)
}
//这样会将换行符之前的数据全部赋值给input

以上是关于golang 从Go中的SDIN读取大文本数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Golang 中从 AWS S3 读取文件

golang 读写二进制文件

Go 读取大文件

golang 简单的go程序从控制台行读取

Go语言(golang)新发布的1.13中的Error Wrapping深度分析

Go语言中的fmt.Scan使用说明