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!
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?
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)
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!