Golang:读取多行文本文件

我有一个多行行的文本文件,由空行分隔。在 Go 中逐行读取该行的最佳方法是什么?


我想我可能不得不使用带有我自己的 Split 功能的 Scanner,但只是想知道是否有更好/更简单的方法。


我曾尝试使用我自己的基于 bufio.ScanLines 的 Splitfunc:


func MyScanLines(data []byte, atEOF bool) (advance int, token []byte,    err error) {

    if atEOF && len(data) == 0 {

            return 0, nil, nil

    }

    if i := bytes.IndexAny(data, "\n\n"); i >= 0 {

            return i + 1, dropCR(data[0:i]), nil

    }

    if atEOF {

            return len(data), dropCR(data), nil

    }

    return 0, nil, nil

}

但是我在 IndexAny 调用中遇到错误:“语法错误:意外的分号或换行符,期待 )”- 修复了


更新:按照建议修复了上面的语法错误,但我只返回了第一行。我正在阅读文件如下:


scanner.Split(MyScanLines)

scanner.Scan()

fmt.Println(scanner.Text())

有什么建议?


我正在尝试阅读的测试文件示例:


Name = "John"

Surname = "Smith"

Val1 = 700

Val2 = 800


Name = "Pete"

Surname = "Jones"

Val1 = 555

Val2 = 666

Val3 = 444


 .

 .

 .



牛魔王的故事
浏览 463回答 3
3回答

杨魅力

这是执行相同操作的另一种方法,使用bufio.Reader. 逻辑几乎与Elwiner的回答相似。myReadLine下面的函数bufio.Reader用于读取文件中的下一个多行条目。func myReadLine(file *os.File, reader *bufio.Reader) (lines []string, err error){  for {    line, _, err := reader.ReadLine()    if err != nil || len(line) == 0 {      break    }    lines = append(lines, string(line))  }  return lines, err}下面的代码示例说明了上述函数的示例用法:reader := bufio.NewReader(file)for {    lines, err := myReadLine(file, reader)    if err != nil || len(lines) == 0 {         break     }    fmt.Println(lines)}

喵喵时光机

您的方法有效,但我建议您使用 a bufio.Scanner,默认为逐行扫描。然后,您只需开始逐行读取文件并填充结构。当遇到空行时,将您的结构放入一个切片并从一个新的切片开始。这是我的一个开源项目中的一个示例,用于演示它:buffer := [][]string{}block := []string{}scanner := bufio.NewScanner(strings.NewReader(data))for scanner.Scan() {    l := scanner.Text()    if len(strings.TrimSpace(l)) != 0 {        block = append(block, l)        continue    }    // At this point, the script has reached an empty line,    // which means the block is ready to be processed.    // If the block is not empty, append it to the buffer and empty it.    if len(block) != 0 {        buffer = append(buffer, block)        block = []string{}    }}if len(block) != 0 {    buffer = append(buffer, block)}

qq_笑_17

破了。首先了解扫描并确保其正常工作:package mainimport (    "bufio"    "fmt"    "strings")func main() {    scanner := bufio.NewScanner(strings.NewReader(data))    for scanner.Scan() {        l := scanner.Text()        fmt.Println(l)    }}var data = `Name = "John"Surname = "Smith"Val1 = 700Val2 = 800Name = "Pete"Surname = "Jones"Val1 = 555Val2 = 666Val3 = 444`这是Go Playground 上的代码。接下来,将您需要的数据收集到一个切片中。可能有一种方法可以检查文件结尾 EOF,但我找不到它。这就是我想出的并且有效:package mainimport (    "bufio"    "fmt"    "strings")func main() {    buffer := [][]string{}    block := []string{}    scanner := bufio.NewScanner(strings.NewReader(data))    for scanner.Scan() {        l := scanner.Text()        if len(l) != 0 {            block = append(block, l)            continue        }        if len(l) == 0 && len(block) != 0 {            buffer = append(buffer, block)            block = []string{}            continue        }        if len(l) == 0 {            block = []string{}            continue        }    }    if len(block) != 0 {        buffer = append(buffer, block)        block = []string{}    }    fmt.Println("PRINTING BUFFER - END OF PROGRAM - ALL DATA PROCESSED:", buffer)}var data = `Name = "John"Surname = "Smith"Val1 = 700Val2 = 800Name = "Pete"Surname = "Jones"Val1 = 555Val2 = 666Val3 = 444`这是操场上的代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go