在文本文件中读入行,排序,然后覆盖文件

ric*_*ick 6 sorting file lines go

我正在尝试编写一个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()
}
Run Code Online (Sandbox Code Playgroud)

当我使用ReadString时,我如何将每一行存储到切片中(或者有更好的方法来存储它们以便我可以操作它们)?然后我会以类似于这样的方式使用sort包:

sorted := sort.Strings(lines) 
Run Code Online (Sandbox Code Playgroud)

然后,写入文件,我使用类似于下面的东西,虽然我还没有列入,因为我还没有得到"排序"的工作:

io.WriteString(ff, (lines + "\n"))
Run Code Online (Sandbox Code Playgroud)

提前感谢您的任何建议!

pet*_*rSO 4

例如,

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)
    }
}
Run Code Online (Sandbox Code Playgroud)