首页 >后端开发 >Golang >如何使用并发在 Go 中高效地读写 CSV 文件?

如何使用并发在 Go 中高效地读写 CSV 文件?

DDD
DDD原创
2024-11-02 20:40:03554浏览

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

Go 中高效的 CSV 读写

Go 中高效读写 CSV 文件的任务涉及优化 I/O 操作。考虑以下代码片段,它读取 CSV 文件,对数据执行计算,并将结果写入新的 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 <p>此代码的关键改进是使用并发来处理 CSV一次一排。通过使用通道,我们可以在 Goroutine 中从输入 CSV 文件中读取行,并将结果同时写入主例程中的输出 CSV 文件中。这种方式避免了将整个文件加载到内存中,可以显着减少内存消耗并提高性能。</p></code>

以上是如何使用并发在 Go 中高效地读写 CSV 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn