读取文件中从字节偏移开始的一行,直到遇到换行符。

huangapple go评论82阅读模式
英文:

Read a row of a file starting at byte offset until new line

问题

我正在使用os.ReadAt()函数来读取csv/tsv文件中的特定行。然而,我不知道该行有多少字节,我只需要从我指定的字节偏移开始读取直到换行符为止。

buffer := make([]byte, 46)
os.ReadAt(buffer, 64) //从字节偏移64处读取内容并放入buffer中

然而,这只能让我读取行中的46个字节。有没有办法读取整行直到换行符为止?

谢谢

更新:

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

英文:

I am using os.ReadAt() to read certain rows in a csv/tsv file. However, I don't know how many bytes are in that row, I just need to read the line starting at the byte offset I specify until the newline.

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

However, this only allows me to read 46 bytes of the line in.
Is there any way to read the entire line until the newline?

Thanks

Update:

I just create a struct that holds the offset and line length.. Should've done this in the beginning.. my bad

答案1

得分: 3

一种方法是使用bufio包。以下是一个示例:

fd, err := os.Open("your_file.csv")
if err != nil { // 错误处理
    log.Println(err)
    return
}

reader := bufio.NewReader(fd) // 创建一个新的读取器

_, err = reader.Discard(64) // 跳过接下来的64个字节
if err != nil { // 错误处理
    log.Println(err)
    return
}

// 如果需要,可以使用isPrefix,此示例未使用
// 读取直到找到一个新行
line, _, err := reader.ReadLine()
if err != nil { // 错误处理
    log.Println(err)
    return
}
fmt.Println(string(line))

另一种读取行的方法是,可以使用fd.Seek(64,0)跳转到特定的字节位置,如下所示:

_, err = fd.Seek(64, 0) // 设置fd的当前位置
if err != nil { // 错误处理
    log.Println(err)
    return
}

然后使用读取器读取行

reader := bufio.NewReader(fd)

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

One way is use the bufio pkg. An example of this is the following:

<!-- language:go -->

fd, err := os.Open(&quot;your_file.csv&quot;)
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&#39;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))

Another way to read the line, you can use fd.Seek(64,0) to jump to a specific byte like

<!-- language:go -->

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

And afterward use the reader to read the line.

<!-- language:go -->

reader := bufio.NewReader(fd)

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

huangapple
  • 本文由 发表于 2017年6月14日 02:27:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/44528935.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定