如何在 Golang 中导出为 CSV?

How to export to CSV in Golang?

我有以下开源代码来生成涟漪地址和密钥,但我想将输出导出到 .csv 或 .xlsx 文件。我尝试通过导入 "encoding/csv" 包来编写函数,但我对 golang 不是很好,无法让它工作。有什么建议吗?

我还希望它迭代 n 次以生成任意数量的密钥。

这是来自 bitbucket 的开源代码。org/dchapes/ripple/cmd/:

  package main

import (
    "flag"
    "fmt"
    "log"

    "bitbucket.org/dchapes/ripple/crypto/rkey"
)

func main() {
    secret := flag.String("secret", "",
        "Ripple secret, if empty gernate a random one")
    flag.Parse()

    var s *rkey.FamilySeed
    var err error
    if *secret != "" {
        s, err = rkey.NewFamilySeed(*secret)
    } else {
        s, err = rkey.GenerateSeed()
    }
    if err != nil {
        log.Fatal(err)
    }

    pubkey := s.PrivateGenerator.PublicGenerator.Generate(0)
    addr := pubkey.Address()

    if *secret == "" {
        if b, err := s.MarshalText(); err != nil {
            log.Fatal(err)
        } else {
            *secret = string(b)
        }
        fmt.Println(" secret:", *secret)
        fmt.Println("address:", addr)
    } else {
        fmt.Println(addr)
    }
}

这是我尝试嵌入但没有成功的代码:

package main

import (
    "os"
    "log"
    "encoding/csv"
)

var data = [][]string{{"Line1", "Hello Readers of"}, {"Line2", "golangcode.com"}}

func main() {
    file, err := os.Create("result.csv")
    checkError("Cannot create file", err)
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    for _, value := range data {
        err := writer.Write(value)
        checkError("Cannot write to file", err)
    }
}

func checkError(message string, err error) {
    if err != nil {
        log.Fatal(message, err)
    }
}

这是我尝试过的一个例子(结合两者)

package main

import (
"flag"
"fmt"
"log"
"os"
"encoding/csv"

"bitbucket.org/dchapes/ripple/crypto/rkey")

func main() {

for i:= 0; i < 2000; i++ {
secret := flag.String("secret", "",
    "Ripple secret, if empty generate a random one")
flag.Parse()

var s *rkey.FamilySeed
var err error
if *secret != "" {
    s, err = rkey.NewFamilySeed(*secret)
} else {
    s, err = rkey.GenerateSeed()
}
if err != nil {
    log.Fatal(err)
}

pubkey := s.PrivateGenerator.PublicGenerator.Generate(0)
addr := pubkey.Address()

if *secret == "" {
    if b, err := s.MarshalText(); err != nil {
        log.Fatal(err)
    } else {
        *secret = string(b)
    }
    fmt.Println(" secret:", *secret)
    fmt.Println("address:", addr)
} else {
    fmt.Println(addr)
}
var data(i)=[][]string{{"secret: ", *secret},{"address: ", addr}}
CSVExport(data(i))
}
}

func CSVExport(data(i) string){
file, err := os.Create("result.csv")
    checkError("Cannot create file", err)
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    for _, value := range data(i) {
        err := writer.Write(value)
        checkError("Cannot write to file", err)
    }
}

func checkError(message string, err error) {
if err != nil {
        log.Fatal(message, err)
    }
}

您好@alon:这是一些代码的开头供您查看。我会说你会从一些基本的围棋教程中学到很多东西。我也不熟悉您实际尝试使用这些数据做什么,但是这段代码生成了一个包含随机秘密和一些相关地址的 csv 文件。

这对帮助您 gofmt 您的源代码的人会有所帮助,这将使后续操作变得更加容易。

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"

    "bitbucket.org/dchapes/ripple/crypto/rkey"
)

func main() {
    var secret string
    // instead of defining data over and over, let's define it once then accumulate things into it.
    data := [][]string{}
    data = append(data, []string{"secret", "address"})
    for i := 0; i < 2000; i++ {
        var s *rkey.FamilySeed
        s, err := rkey.GenerateSeed()
        if err != nil {
            log.Fatal(err)
        }

        pubkey := s.PrivateGenerator.PublicGenerator.Generate(0)
        addr := pubkey.Address()

        if b, err := s.MarshalText(); err != nil {
            log.Fatal(err)
        } else {
            secret = string(b)
        }
        fmt.Printf("Secret:%s\tAddress:%s\n", secret, addr)
        data = append(data, []string{secret, addr})

    }
    // Instead of writing 2000 csv files over each other, let's write one with
    // 2000 lines instead.
    if err := csvExport(data); err != nil {
        log.Fatal(err)
    }
}

// Changed to csvExport, as it doesn't make much sense to export things from
// package main
func csvExport(data [][]string) error {
    file, err := os.Create("result.csv")
    if err != nil {
        return err
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    for _, value := range data {
        if err := writer.Write(value); err != nil {
            return err // let's return errors if necessary, rather than having a one-size-fits-all error handler
        }
    }
    return nil
}

要批量写入,您可以使用 WriteAll,请参阅 https://golang.org/src/encoding/csv/example_test.go

中的完整示例
func ExampleWriter_WriteAll() {
    records := [][]string{
        {"first_name", "last_name", "username"},
        {"Rob", "Pike", "rob"},
        {"Ken", "Thompson", "ken"},
        {"Robert", "Griesemer", "gri"},
    }

    w := csv.NewWriter(os.Stdout)
    w.WriteAll(records) // calls Flush internally

    if err := w.Error(); err != nil {
        log.Fatalln("error writing csv:", err)
    }
    // Output:
    // first_name,last_name,username
    // Rob,Pike,rob
    // Ken,Thompson,ken
    // Robert,Griesemer,gri
}