Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh membaca dan menulis fail CSV dengan cekap dalam Go menggunakan concurrency?
CSV Baca dan Tulis yang Cekap dalam Go
Tugas membaca dan menulis fail CSV dengan cekap dalam Go melibatkan pengoptimuman operasi I/O . Pertimbangkan coretan kod berikut yang membaca fail CSV, melakukan pengiraan pada data dan menulis keputusan ke fail CSV baharu:
<code class="go">package main import ( "encoding/csv" "fmt" "log" "os" "strconv" ) func ReadRow(r *csv.Reader) (map[string]string, error) { record, err := r.Read() if err == io.EOF { return nil, io.EOF } if err != nil { return nil, err } m := make(map[string]string) for i, v := range record { m[strconv.Itoa(i)] = v } return m, nil } func main() { // load data csv csvFile, err := os.Open("./path/to/datafile.csv") if err != nil { log.Fatal(err) } defer csvFile.Close() // create channel to process rows concurrently recCh := make(chan map[string]string, 10) go func() { defer close(recCh) r := csv.NewReader(csvFile) if _, err := r.Read(); err != nil { //read header log.Fatal(err) } for { rec, err := ReadRow(r) if err == io.EOF { return // no more rows to read } if err != nil { log.Fatal(err) } recCh <- rec } }() // write results to a new csv outfile, err := os.Create("./where/to/write/resultsfile.csv")) if err != nil { log.Fatal("Unable to open output") } defer outfile.Close() writer := csv.NewWriter(outfile) for record := range recCh { time := record["0"] value := record["1"] // get float values floatValue, err := strconv.ParseFloat(value, 64) if err != nil { log.Fatal("Record: %v, Error: %v", floatValue, err) } // calculate scores; THIS EXTERNAL METHOD CANNOT BE CHANGED score := calculateStuff(floatValue) valueString := strconv.FormatFloat(floatValue, 'f', 8, 64) scoreString := strconv.FormatFloat(prob, 'f', 8, 64) //fmt.Printf("Result: %v\n", []string{time, valueString, scoreString}) writer.Write([]string{time, valueString, scoreString}) } writer.Flush() }</code>
Peningkatan utama dalam kod ini ialah penggunaan konkurensi untuk memproses CSV baris satu demi satu. Dengan menggunakan saluran, kita boleh membaca baris daripada fail CSV input dalam goroutine dan menulis hasilnya pada fail CSV output dalam rutin utama secara serentak. Pendekatan ini mengelakkan memuatkan keseluruhan fail ke dalam memori, yang boleh mengurangkan penggunaan memori dan meningkatkan prestasi dengan ketara.
Atas ialah kandungan terperinci Bagaimanakah saya boleh membaca dan menulis fail CSV dengan cekap dalam Go menggunakan concurrency?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!