csv - 使用 Golang 读取 csv,重新排序列然后将结果写入具有并发性的新 csv

标签 csv go concurrency

这是我的起点。

这是一个 Golang 脚本,用于读取包含 3 列的 csv,对列重新排序并将结果写入新的 csv 文件。

package main

import (
   "fmt"
   "encoding/csv"
   "io"
   "os"
   "math/rand"
   "time"
)

func main(){
  start_time := time.Now()

  // Loading csv file
  rFile, err := os.Open("data/small.csv") //3 columns
  if err != nil {
    fmt.Println("Error:", err)
    return
   }
  defer rFile.Close()

  // Creating csv reader
  reader := csv.NewReader(rFile)

  lines, err := reader.ReadAll()
  if err == io.EOF {
      fmt.Println("Error:", err)
      return
  }

  // Creating csv writer
  wFile, err := os.Create("data/result.csv")
  if err != nil {
      fmt.Println("Error:",err)
      return
  }
  defer wFile.Close()
  writer := csv.NewWriter(wFile)

  // Read data, randomize columns and write new lines to results.csv
  rand.Seed(int64(time.Now().Nanosecond()))
  var col_index []int
  for i,line :=range lines{
      if i == 0 {
        //randomize column index based on the number of columns recorded in the 1st line
        col_index = rand.Perm(len(line))
    }
    writer.Write([]string{line[col_index[0]], line[col_index[1]], line[col_index[2]]}) //3 columns
    writer.Flush()
}

//print report
fmt.Println("No. of lines: ",len(lines))
fmt.Println("Time taken: ", time.Since(start_time))

}

问题:

  1. 我的代码是否适合 Golang 语言?

  2. 如何向这段代码添加并发?

最佳答案

您的代码没问题。并发的情况不多。但是您至少可以减少动态重新排序的内存消耗。只需使用 Read() 而不是 ReadAll() 即可避免为孔输入文件分配 slice 。

for line, err := reader.Read(); err == nil; line, err = reader.Read(){
    if err = writer.Write([]string{line[col_index[0]], line[col_index[1]], line[col_index[2]]}); err != nil {
            fmt.Println("Error:", err)
            break
    }
    writer.Flush()
}

关于csv - 使用 Golang 读取 csv,重新排序列然后将结果写入具有并发性的新 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41938068/

相关文章:

python - 将多个数据框合并在一起

go - 如何在DynamoDB UpdateItem中更新数组对象

java - Akka Actor 之间的长时间延迟

javascript - imacros:如何从 .csv 提取的电子邮件地址中删除后缀 (@gmail.com)

scala - 如何使用 Scala 解析带有空列的 CSV 数据?

go - 如何丢弃 Go 中连接中的任何传入数据?

http - 在 net.Conn 之上创建一个 http 响应编写器

c - 不透明函数调用在编译器优化中意味着什么?

c++ - 英特尔线程构建 block 并发队列 : Using pop() over pop_if_present()

html - 从 HTML 表下载 CSV