file - 读取文本文件中的行,排序,然后覆盖文件

标签 file sorting go lines

我正在尝试编写一个 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/

相关文章:

php - .htaccess 启用 php 文件信息扩展

c - C 中数字数组的排序

mysql - 我应该在 Go Web 应用程序中始终打开 1 个全局数据库连接吗?或者我应该每次都打开并关闭它?

google-app-engine - GAE Flex Golang 开发环境

go - 如何使用 map 在 cookie 中传递多个值

c# - 递归计算文件夹中文件的行数

c++ - 如何在不关闭 C++ fstream 文件的情况下保存和读取它

c++ - 用 C++ 等效项替换 C 内存映射

java - 给定一个数字流,例如 1,3,5,4,6,9,我被要求打印它们,例如 1,3-6,9

java - 如何实现归并排序?