泛舟湖上清波郎朗
这是一个老问题,但如果有人正在寻找解决方案,我编写了一个包来处理文件中的任何行。链接在这里。它可以打开一个文件并搜索到任何行位置,而无需将整个文件读入内存并进行拆分。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)
人到中年有点甜
我编写了一个小函数,允许您从文件中删除特定行。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)}