Lecture et écriture CSV efficaces dans Go
La tâche de lire et d'écrire efficacement un fichier CSV dans Go implique d'optimiser les opérations d'E/S . Considérez l'extrait de code suivant qui lit un fichier CSV, effectue des calculs sur les données et écrit les résultats dans un nouveau fichier CSV :
<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>
La principale amélioration de ce code est l'utilisation de la concurrence pour traiter le CSV. lignes une à la fois. En utilisant un canal, nous pouvons lire les lignes du fichier CSV d'entrée dans une goroutine et écrire simultanément les résultats dans le fichier CSV de sortie dans la routine principale. Cette approche évite de charger l'intégralité du fichier en mémoire, ce qui peut réduire considérablement la consommation de mémoire et améliorer les performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!