Heim  >  Artikel  >  Backend-Entwicklung  >  Idiom Gehen, um genau N Zeilen (anstelle eines Bytes) Text zu lesen?

Idiom Gehen, um genau N Zeilen (anstelle eines Bytes) Text zu lesen?

WBOY
WBOYnach vorne
2024-02-09 08:40:09980Durchsuche

惯用语 Go 精确读取 N 行(而不是一个字节)的文本?

Der PHP-Editor Apple stellt Ihnen ein Idiom Go vor, das eine bestimmte Anzahl von Textzeilen (anstelle eines Bytes) genau liest. Wenn wir mit Textdateien arbeiten, müssen wir oft eine bestimmte Anzahl von Zeilen lesen, anstatt Byte für Byte zu lesen. Mit dem Bufio-Paket der Go-Sprache können wir dieses Ziel leicht erreichen. Als Nächstes werden wir im Detail erläutern, wie diese Redewendung verwendet wird, um die Funktion zum genauen Lesen einer bestimmten Anzahl von Textzeilen zu erreichen. Lasst uns gemeinsam erkunden!

Frageninhalt

Ich habe eine CSV-Datei von einem Berichtsgenerator, die einige Nicht-CSV-Präambeln hinzufügt, wie zum Beispiel:

Time Off Requests

My Org
Street Address
City, State  ZIP

Col1,Col2,Col3
r1c1,r1c2,r1c3
r2c1,r2c2,r2c3

Ich muss diese 6 Zeilen verwerfen, bevor ich den io.Reader der Datei an csv.NewReader übergebe und ReadAll() versuche, also muss ich sicherstellen, dass ich nach Zeile 6 keine Bytes lese.

Ich habe ursprünglich an bufio.Scanner gedacht und Scan() sechsmal in einer Schleife aufgerufen, habe aber später durch Experimente festgestellt, dass „buf“ in bufio bedeutet, dass ich keine Kontrolle darüber habe, wo der gepufferte Lesevorgang endet, und dass möglicherweise mehr als der gelesen wird echte Ausgangsposition CSV.

Also habe ich mir eine Lösung ausgedacht, die darin besteht, Byte für Byte zu lesen, bis ich 6 Zeilenumbrüche (10) gezählt habe:

f, _ := os.Open(csvPath)

// Read just past report-generated 6-line preamble
b := make([]byte, 1)
for i := 0; i < 6; {
    f.Read(b)
    if b[0] == 10 {
        i++
    }
}

r := csv.NewReader(f)
records, err = r.ReadAll()
...

Das funktioniert. Aber gibt es einen idiomatischeren Go-Weg?

Problemumgehung

Sie müssen die Verwendung von bufio,事实上您应该尽可能选择使用缓冲 IO。您不能做的是通过 bufio.Reader 访问它之后使用原始阅读器,即,在使用 bufio.NewReader 后,不要将 os.File 传递给 csv.NewReader,继续使用 bufio.Reader nicht vermeiden, das Daten enthalten kann, die aus einer Datei gelesen wurden.

Sobald Sie bufio.Reader haben, können Sie alle Methoden verwenden, um Teile des Streams zu lesen, ohne sich Gedanken über das Byte-für-Byte-Lesen machen zu müssen.

buf := bufio.NewReader(f)
// the preambled is defined as 6 lines
for i := 0; i < 6; i++ {
    line, err := buf.ReadBytes('\n')
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("line: %q\n", line)
}
r := csv.NewReader(buf)
records, err := r.ReadAll()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("records: %q\n", records)

Vollständiges Beispiel

Das obige ist der detaillierte Inhalt vonIdiom Gehen, um genau N Zeilen (anstelle eines Bytes) Text zu lesen?. 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