gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:12:35 27 4
gpt4 key购买 nike

这是我的起点。

这是一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com