我有一个test.csv,我要逐行读取它,并确定每行有多少字节.

这应该是下面的37个字节,因为我在Windows上,前两行有\r\n个加上总共4个字节.

foo,bar,baz
100,200,300
400,500,600

我想使用csv.NewReader()简单地确定每行有多少字节.但是,我知道csv.Reader在我的以下代码中进行字节计数时不会计算每行中的逗号和\n.

我应该为每一行中的逗号数量加上一些数学运算+为\r\n添加2字节-1为最后一行添加一个字节,因为它没有\r\n?这感觉有点老生常谈,所以我宁愿看看是否有更好的解决字节计数问题的方法.

我的代码是:

package main

import (
    "encoding/csv"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    file, err := os.Open("test.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    fileInfo, err := file.Stat()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("file total bytes is %d\n", fileInfo.Size())

    // init reader
    reader := csv.NewReader(file)

    // extract the header
    headers, err := reader.Read()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("headers are: %+v\n", headers)

    byteCounter := 0
    for {
        // if we reached end of file, stop
        if err == io.EOF {
            break
        }

        // read a record
        record, err := reader.Read()
        if err != nil {
            log.Fatal(err)
        }
        // loop through each record and count how many bytes
        for _, item := range record {
            byteCounter += len(item)
            fmt.Printf("record is %d bytes\n", len(item))
        }
        fmt.Println("total bytes so far is: ", byteCounter)

    }
}

推荐答案

使用Reader.InputOffset获取文件中的当前位置:

fmt.Println("total bytes so far is: ", reader.InputOffset())

https://go.dev/play/p/cgqq9woK02w

要获得每行的字节数,请从先前的偏移量中减go .

prevOffset := reader.InputOffset()

for {
    ...
    // read a record
    _, err := reader.Read()
    ...
    fmt.Println("line length is: ", reader.InputOffset()-prevOffset)
    prevOffset = reader.InputOffset()

}

https://go.dev/play/p/cXCfogUBcdy

Go相关问答推荐

Go 1.22 http mux:在同一路径上提供一个手柄和一个FS

为什么工具链指令在这种情况下没有效果?

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

埃拉托塞尼筛:加快交叉关闭倍数步骤

go-chi: 接受带有反斜杠的 url 路径参数

如何在正则表达式中使整个单词可选?

如何解决构建Docker Compose时的权限被拒绝问题

正确的 shell 程序进入 golang alpine docker 容器的入口点?

通过多阶段构建复制到 Docker 容器中时找不到文件

对 CSV 进行单元测试失败

Golang crypto/rand 线程安全吗?

regex.ReplaceAll 但如果替换则添加相同数量的字符

为什么不同的 Wireguard 私钥会产生相同的公钥?

使用自定义处理程序 nats golang 保留订阅方法

为什么当我忽略 template.New() 程序可以成功运行?

处理程序后访问 HTTP 请求上下文

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别

有没有办法在一个 goroutine 返回后延迟后取消上下文?

gqlgen go,通过添加一个解析器来减少数据库调用

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?