【问题标题】:Read a row of a file starting at byte offset until new line从字节偏移量开始读取文件的一行,直到换行
【发布时间】:2017-11-15 16:06:16
【问题描述】:

我正在使用 os.ReadAt() 读取 csv/tsv 文件中的某些行。但是,我不知道该行中有多少字节,我只需要从我指定的字节偏移量开始读取行,直到换行。

buffer = make([]byte, 46)
os.ReadAt(buffer, 64) //Read at byte offset 64 and put contents in buffer

但是,这只允许我读取 46 个字节的行。 有没有办法读取整行直到换行?

谢谢

更新:

我只是创建了一个包含偏移量和行长的结构。一开始就应该这样做。我的错

【问题讨论】:

    标签: file go byte reader


    【解决方案1】:

    一种方法是使用bufio pkg。一个例子如下:

    fd, err := os.Open("your_file.csv")
    if err != nil { //error handler
        log.Println(err)
        return
    }
    
    reader := bufio.NewReader(fd) // creates a new reader
    
    _, err = reader.Discard(64) // discard the following 64 bytes
    if err != nil { // error handler
        log.Println(err)
        return
    }
    
    // use isPrefix if is needed, this example doesn't use it
    // read line until a new line is found
    line, _, err := reader.ReadLine() 
    if err != nil { // error handler
        log.Println(err)
        return
    }
    fmt.Println(string(line))
    

    另一种读取行的方式,可以使用fd.Seek(64,0) 跳转到特定字节like

    _, err = fd.Seek(64, 0)  // Set the current position for the fd
    if err != nil { // error handler
        log.Println(err)
        return
    }
    

    然后使用阅读器阅读该行。

    reader := bufio.NewReader(fd)
    
    line, _, err := reader.ReadLine()
    if err != nil {
        log.Println(err)
        return
    }
    fmt.Println(string(line))
    

    【讨论】:

    • 我必须退回到我当前正在阅读的文件中,所以我不能只丢弃接下来的 n 个字节。有时我必须跳回文件的顶部。你能在discard里面放一个负数吗?
    • 否,但您可以使用 file.seek() 并在需要时创建另一个 bufio.Reader
    • 是的..我试图避免这种情况..但我想这是唯一的选择。谢谢!
    猜你喜欢
    • 2013-09-25
    • 2013-01-03
    • 2012-11-30
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多