在 Go 中跳转到文件中的特定行

在 Go 中是否可以跳转到文件中的特定行号并删除它?类似于python 中的linecache 的东西。

我正在尝试匹配文件中的一些子字符串并删除相应的行。我已经处理的匹配部分,我有一个包含行号的数组,我需要删除,但我一直在思考如何删除文件中的匹配行。


温温酱
浏览 343回答 3
3回答

泛舟湖上清波郎朗

这是一个老问题,但如果有人正在寻找解决方案,我编写了一个包来处理文件中的任何行。链接在这里。它可以打开一个文件并搜索到任何行位置,而无需将整个文件读入内存并进行拆分。import "github.com/stoicperlman/fls"// This is just a wrapper around os.OpenFile. Alternatively // you could open from os.File and use fls.LineFile(file) to get ff, err := fls.OpenFile("test.log", os.O_CREATE|os.O_WRONLY, 0600)defer f.Close()// return begining line 1/begining of file// equivalent to f.Seek(0, io.SeekStart)pos, err := f.SeekLine(0, io.SeekStart)// return begining line 2pos, err := f.SeekLine(1, io.SeekStart)// return begining of last linepos, err := f.SeekLine(0, io.SeekEnd) // return begining of second to last linepos, err := f.SeekLine(-1, io.SeekEnd) 不幸的是,我不确定您将如何删除,这只是让您到达文件中的正确位置。对于您的情况,您可以使用它转到要删除的行并保存位置。然后寻找下一行并保存。您现在有要删除的行的书挡。// might want lineToDelete - 1// this acts like 0 based arraypos1, err := f.SeekLine(lineToDelete, io.SeekStart)// skip ahead 1 linepos2, err := f.SeekLine(1, io.SeekCurrent)// pos2 will be the position of the first character in next line// might want pos2 - 1 depending on how the function worksDeleteBytesFromFileFunction(f, pos1, pos2)

喵喵时光机

根据我对 linecache 模块的读取,它需要一个文件并将其分解为基于 '\n' 行结尾的数组。您可以使用strings或bytes复制 Go 中的相同行为。您还可以使用bufio库逐行读取文件,并仅存储或保存所需的行。package mainimport (    "bytes"    "fmt")import "io/ioutil"func main() {    b, e := ioutil.ReadFile("filename.txt")    if e != nil {        panic(e)    }    array := bytes.Split(b, []byte("\n"))    fmt.Printf("%v", array)}

人到中年有点甜

我编写了一个小函数,允许您从文件中删除特定行。package mainimport (    "io/ioutil"    "os"    "strings")func main() {    path := "path/to/file.txt"    removeLine(path, 2)}func removeLine(path string, lineNumber int) {    file, err := ioutil.ReadFile(path)    if err != nil {        panic(err)    }    info, _ := os.Stat(path)    mode := info.Mode()    array := strings.Split(string(file), "\n")    array = append(array[:lineNumber], array[lineNumber+1:]...)    ioutil.WriteFile(path, []byte(strings.Join(array, "\n")), mode)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go