Heim > Artikel > Backend-Entwicklung > Idiom Gehen, um genau N Zeilen (anstelle eines Bytes) Text zu lesen?
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!
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?
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)
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!