英文:
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("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))
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))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论