亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang:讀取多行文本文件

Golang:讀取多行文本文件

Go
牛魔王的故事 2021-12-06 10:50:45
我有一個多行行的文本文件,由空行分隔。在 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 = 700Val2 = 800Name = "Pete"Surname = "Jones"Val1 = 555Val2 = 666Val3 = 444 . . .
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

這是執行相同操作的另一種方法,使用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)

}


查看完整回答
反對 回復 2021-12-06
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

您的方法有效,但我建議您使用 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)

}


查看完整回答
反對 回復 2021-12-06
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

破了。首先了解掃描并確保其正常工作:


package main


import (

    "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 = 700

Val2 = 800


Name = "Pete"

Surname = "Jones"

Val1 = 555

Val2 = 666

Val3 = 444

`

這是Go Playground 上的代碼。


接下來,將您需要的數據收集到一個切片中??赡苡幸环N方法可以檢查文件結尾 EOF,但我找不到它。這就是我想出的并且有效:


package main


import (

    "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 = 700

Val2 = 800


Name = "Pete"

Surname = "Jones"

Val1 = 555

Val2 = 666

Val3 = 444

`

這是操場上的代碼。


查看完整回答
反對 回復 2021-12-06
  • 3 回答
  • 0 關注
  • 522 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號