我正在尝试编写一个 go 函数,它将读取文本文件中的行,对它们进行排序(按字母顺序排列),然后将它们覆盖回文件中。现在,我基本上可以模拟 cat
,但我似乎无法操作 read_line 中元素的内容。
func sort() {
ff, _ := os.OpenFile(file, os.O_RDWR, 0666)
f := bufio.NewReader(ff)
for {
read_line, _ := f.ReadString('\n')
fmt.Print(read_line)
if read_line == "" {
break
}
}
ff.Close()
}
当我使用 ReadString 时,如何将每一行存储到一个 slice 中(或者是否有更好的存储方式以便我可以操作它们)?然后我会以类似于这样的方式使用 sort 包:
sorted := sort.Strings(lines)
然后,为了写入文件,我正在使用类似于以下内容的内容,尽管我没有包含它,因为我还没有让“排序”工作:
io.WriteString(ff, (lines + "\n"))
提前感谢您的任何建议!
最佳答案
例如,
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func readLines(file string) (lines []string, err os.Error) {
f, err := os.Open(file)
if err != nil {
return nil, err
}
defer f.Close()
r := bufio.NewReader(f)
for {
const delim = '\n'
line, err := r.ReadString(delim)
if err == nil || len(line) > 0 {
if err != nil {
line += string(delim)
}
lines = append(lines, line)
}
if err != nil {
if err == os.EOF {
break
}
return nil, err
}
}
return lines, nil
}
func writeLines(file string, lines []string) (err os.Error) {
f, err := os.Create(file)
if err != nil {
return err
}
defer f.Close()
w := bufio.NewWriter(f)
defer w.Flush()
for _, line := range lines {
_, err := w.WriteString(line)
if err != nil {
return err
}
}
return nil
}
func main() {
file := `lines.txt`
lines, err := readLines(file)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
sort.Strings(lines)
err = writeLines(file, lines)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
关于file - 读取文本文件中的行,排序,然后覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424340/