"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मैं समवर्ती का उपयोग करके Go में CSV फ़ाइलों को कुशलतापूर्वक कैसे पढ़ और लिख सकता हूँ?

मैं समवर्ती का उपयोग करके Go में CSV फ़ाइलों को कुशलतापूर्वक कैसे पढ़ और लिख सकता हूँ?

2024-11-09 को प्रकाशित
ब्राउज़ करें:579

How can I efficiently read and write CSV files in Go using concurrency?

Go में कुशल CSV पढ़ें और लिखें

Go में CSV फ़ाइल को कुशलतापूर्वक पढ़ने और लिखने के कार्य में I/O संचालन को अनुकूलित करना शामिल है . निम्नलिखित कोड स्निपेट पर विचार करें जो CSV फ़ाइल को पढ़ता है, डेटा पर गणना करता है, और परिणामों को एक नई CSV फ़ाइल में लिखता है:

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

इस कोड में मुख्य सुधार सीएसवी पंक्तियों को एक-एक करके संसाधित करने के लिए समवर्ती का उपयोग है। एक चैनल का उपयोग करके, हम गोरोइन में इनपुट सीएसवी फ़ाइल से पंक्तियों को पढ़ सकते हैं और परिणामों को मुख्य रूटीन में आउटपुट सीएसवी फ़ाइल में समवर्ती रूप से लिख सकते हैं। यह दृष्टिकोण संपूर्ण फ़ाइल को मेमोरी में लोड करने से बचाता है, जो मेमोरी की खपत को काफी कम कर सकता है और प्रदर्शन में सुधार कर सकता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3