Rumah >pembangunan bahagian belakang >Golang >Idiom Pergi ke membaca dengan tepat N baris (bukan satu bait) teks?

Idiom Pergi ke membaca dengan tepat N baris (bukan satu bait) teks?

WBOY
WBOYke hadapan
2024-02-09 08:40:091024semak imbas

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

Editor php Apple akan memperkenalkan kepada anda simpulan bahasa Go yang membaca dengan tepat bilangan baris tertentu (bukannya satu bait) teks. Apabila bekerja dengan fail teks, kita selalunya perlu membaca bilangan baris tertentu, bukannya membaca bait demi bait. Menggunakan pakej bufio bahasa Go, kita boleh mencapai matlamat ini dengan mudah. Seterusnya, kami akan memperincikan cara menggunakan simpulan bahasa ini untuk mencapai fungsi membaca dengan tepat bilangan baris teks yang ditentukan. Mari kita meneroka bersama-sama!

Kandungan soalan

Saya mempunyai CSV daripada penjana laporan yang menambahkan beberapa mukadimah bukan CSV seperti:

Time Off Requests

My Org
Street Address
City, State  ZIP

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

Saya perlu membuang 6 baris ini sebelum menghantar io.Reader fail kepada csv.NewReader dan mencuba ReadAll() , jadi saya perlu memastikan saya tidak membaca sebarang bait selepas baris 6.

Saya pada mulanya memikirkan bufio.Scanner dan memanggil Scan() 6 kali dalam satu gelung, tetapi kemudian menyedari melalui percubaan bahawa "buf" dalam bufio bermakna saya tidak mempunyai kawalan ke atas tempat bacaan buffer berakhir, dan ia mungkin membaca lebih banyak daripada CSV kedudukan permulaan sebenar.

Jadi saya datang dengan penyelesaian, iaitu membaca bait demi bait sehingga saya mengira 6 baris baharu (10):

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()
...

Ini berkesan. Tetapi adakah terdapat cara Go yang lebih idiomatik?

Penyelesaian

Anda tidak perlu mengelak daripada menggunakan bufio,事实上您应该尽可能选择使用缓冲 IO。您不能做的是通过 bufio.Reader 访问它之后使用原始阅读器,即,在使用 bufio.NewReader 后,不要将 os.File 传递给 csv.NewReader,继续使用 bufio.Reader yang mungkin mengandungi data yang telah dibaca daripada fail.

Sebaik sahaja anda mempunyai bufio.Reader anda boleh menggunakan semua kaedah untuk membaca bahagian strim tanpa perlu risau tentang membaca bait demi bait.

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)

Contoh penuh

Atas ialah kandungan terperinci Idiom Pergi ke membaca dengan tepat N baris (bukan satu bait) teks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam