为了账号安全,请及时绑定邮箱和手机立即绑定

我可以传递一个字符串作为 bufio.ReadString() 的分隔符吗?

我可以传递一个字符串作为 bufio.ReadString() 的分隔符吗?

Go
米琪卡哇伊 2021-12-07 10:30:14
我有一个包含多行查询的文件。我想一一阅读并打印出来。就像是 :临时文件select * from table1;  select *  from table2;select 1; 由于我可以进行多行查询,因此我想使用 ;\n 作为分隔符。那可能吗 ?有没有更好的方法可以代替bufio.ReadString?
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

首先,原型bufio.ReadString是


 func (b *Reader) ReadString(delim byte) (line string, err error)

它只能将一个字节作为 arg,因此您的;\n分隔符将不起作用。


使用;作为分隔符来代替。


但是如果你使用ReadString(';')它会在你的结果中包含其他字符,比如 '\n'


一个例子:


package main


import (

    "bufio"

    "fmt"

    "strings"

)


func main() {


    const raw = `select * from table1;  

select *  

from table2;


select 1;`


    br := bufio.NewReader(strings.NewReader(raw))


    var err error

    var s string

    err = nil

    for err == nil {

        s, err = br.ReadString(';')

        if err == nil {

            fmt.Printf("%q", s)

        }


    }

这将得到:


"select * from table1;""  \nselect *  \nfrom table2;""\n\nselect 1;"



解决方案:


使用Scanner可能更方便,实现如下。


ps:;将被视为单词的一部分


package main


import (

    "bufio"

    "fmt"

    "os"

    "strings"

    "bytes"

)


func main() {

    const raw = `select * from table1;  

select *  

from table2;


select 1;`


    scanner := bufio.NewScanner(strings.NewReader(raw))

    scanner.Split(bufio.ScanWords)


    var tmpbuf bytes.Buffer


    for scanner.Scan() {

        w := scanner.Text()

        tmpbuf.WriteString(w)

        if w[len(w)-1] == ';' {

            tmpbuf.WriteString("\n")

            fmt.Printf(tmpbuf.String())

            tmpbuf.Reset()

        } else {

            tmpbuf.WriteString(" ")

        }

    }

    if err := scanner.Err(); err != nil {

        fmt.Fprintln(os.Stderr, "reading input:", err)

    }

}

你会得到:


select * from table1;

select * from table2;

select 1;


查看完整回答
反对 回复 2021-12-07
?
www说

TA贡献1775条经验 获得超8个赞

您可以使用bufio.Scannerhttps : //golang.org/pkg/bufio/#Scanner 查看行示例:https : //golang.org/pkg/bufio/#example_Scanner_lines


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信