代码之家  ›  专栏  ›  技术社区  ›  Coldchain9

确定果朗CSV行中的字节数

  •  1
  • Coldchain9  · 技术社区  · 2 年前

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

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

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

    我想简单地使用 csv.NewReader() 。但是,我知道csv。阅读器没有计算逗号和 \n 在我下面的代码中,每行字节计数时。

    我应该为每行中的逗号数+行数加2个字节吗 \\r\n -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)
    
        }
    }
    
    1 回复  |  直到 2 年前
        1
  •  4
  •   Vivek Ramaswamy    2 年前

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

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

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

    要获得每行的字节数,请从上一个偏移量中减去。

    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