Hier ist mein Ausgangspunkt.Mit Golang CSV lesen, Spalten neu anordnen und Ergebnis in eine neue CSV mit Concurrency schreiben
Es ist ein Golang-Skript, in einem CSV mit 3 Spalten zu lesen, die Spalten neu anordnen und das Ergebnis in eine neue CSV-Datei schreiben.
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))
}
Frage:
Ist mein Code idiomatische für Golang?
Wie kann ich diesem Code Parallelität hinzufügen?
Sie können nicht einzelne Dateien gleichzeitig lesen oder schreiben, und wenn die Datenverarbeitung so viel schneller als die IO ist, hat es wenig Vorteile, das Lesen einer Datei gleichzeitig mit dem Schreiben einer anderen Datei zu machen. Wenn die Dateien riesig sind, kann es sich lohnen, aber zuerst ein funktionierendes Beispiel, um die Grundlagen zu verstehen. – JimB
Dies ist möglicherweise besser für [codereview.stackexchange.com] (http://codereview.stackexchange.com/) geeignet. – icza
@ JimB Ah, ich wusste nicht, dass das Lesen/Schreiben von Dateien nicht gleichzeitig möglich ist. Wenn ich meine Randomisierung von Spalten als ein separates Verfahren, z. func RandomizeColumns ([] string), könnte ich mein Reader-Objekt in 2 Streams teilen und RandomizeColumns() gleichzeitig anwenden? I.e. kann ich ein csv.Reader() Objekt in 2 teilen? –