Heim  >  Artikel  >  Backend-Entwicklung  >  Bestimmen Sie, wie viele Bytes eine CSV-Zeile in Golang hat

Bestimmen Sie, wie viele Bytes eine CSV-Zeile in Golang hat

王林
王林nach vorne
2024-02-05 23:33:081015Durchsuche

确定 Golang 中 CSV 行有多少字节

Frageninhalt

Ich habe ein test.csv und ich werde es Zeile für Zeile lesen und feststellen, wie viele Bytes in jeder Zeile sind.

Dies sollte weniger als 37 Bytes sein, da ich unter Windows arbeite und die ersten beiden Zeilen rn insgesamt 4 Bytes hinzufügen.

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

Ich möchte csv.NewReader() 简单地确定每行中有多少字节。但是,我知道在下面的代码中进行字节计数时,csv.Reader 不会计算每行中的逗号和 n verwenden.

Sollte ich etwas Mathematik für die Anzahl der Kommas in jeder Zeile + die Anzahl der Zeilen hinzufügen, rn -1, um 2 Bytes für die letzte Zeile hinzuzufügen, da sie kein rn hat? Das fühlt sich etwas abgedroschen an, deshalb würde ich lieber sehen, ob es eine bessere Lösung für mein Byte-Count-Problem gibt.

Mein Code:

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)

    }
}

Richtige Antwort


Verwenden Sie Reader.InputOffset, um die aktuelle Position in der Datei zu erhalten: BD44F3686574B2610B9F6F11A1F9CFEF

https://www.php.cn/link/e2c2ff9c7fb57db574e461fbe467d84e

Um die Anzahl der Bytes pro Zeile zu erhalten, subtrahieren Sie den vorherigen Offset.

prevOffset := reader.InputOffset()

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

}

https://www.php.cn/link/501e3f8a108d7ab9335ceecd363d113d

Das obige ist der detaillierte Inhalt vonBestimmen Sie, wie viele Bytes eine CSV-Zeile in Golang hat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen