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

问题描述 投票:2回答:3

在Go中,是否可以跳转到文件中的特定行号并将其删除?像python中的linecache之类的东西。

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

file csv go
3个回答
0
投票

我写了一个小函数,允许你从文件中删除一个特定的行。

package main

import (
    "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)
}

1
投票

这是一个老问题,但如果有人在寻找解决方案,我会编写一个包来处理文件中的任何行。 Link here。它可以打开文件并寻找任何行位置,而无需将整个文件读入内存并进行拆分。

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 f
f, 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 2
pos, err := f.SeekLine(1, io.SeekStart)

// return begining of last line
pos, err := f.SeekLine(0, io.SeekEnd) 

// return begining of second to last line
pos, err := f.SeekLine(-1, io.SeekEnd) 

不幸的是我不确定你会如何删除,这只是处理你到文件中的正确位置。对于您的情况,您可以使用它来转到要删除的行并保存位置。然后寻找下一行并保存它。您现在要删除该行的书挡。

// might want lineToDelete - 1
// this acts like 0 based array
pos1, err := f.SeekLine(lineToDelete, io.SeekStart)

// skip ahead 1 line
pos2, 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 works
DeleteBytesFromFileFunction(f, pos1, pos2)

0
投票

基于我对linecache模块的读取,它接受一个文件并将其分解为基于'\ n'行结尾的数组。您可以使用stringsbytes在Go中复制相同的行为。您还可以使用bufio库逐行读取文件,只存储或保存所需的行。

package main

import (
    "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)
}
© www.soinside.com 2019 - 2024. All rights reserved.