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

我有一个包含多行查询的文件。我想一一阅读并打印出来。就像是 :


临时文件


select * from table1;  

select *  

from table2;


select 1; 

由于我可以进行多行查询,因此我想使用 ;\n 作为分隔符。那可能吗 ?有没有更好的方法可以代替bufio.ReadString?


米琪卡哇伊
浏览 219回答 2
2回答

侃侃无极

首先,原型bufio.ReadString是 func (b *Reader) ReadString(delim byte) (line string, err error)它只能将一个字节作为 arg,因此您的;\n分隔符将不起作用。使用;作为分隔符来代替。但是如果你使用ReadString(';')它会在你的结果中包含其他字符,比如 '\n'一个例子:package mainimport (    "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 mainimport (    "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;

www说

您可以使用bufio.Scanner:https : //golang.org/pkg/bufio/#Scanner 查看行示例:https : //golang.org/pkg/bufio/#example_Scanner_lines
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go