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)
}

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)
}

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
`
這是操場上的代碼。
- 3 回答
- 0 關注
- 522 瀏覽
添加回答
舉報