简体   繁体   English

如何在Golang中导出为CSV?

[英]How to export to CSV in Golang?

I have the following open-source code to generate ripple addresses and secret keys, but I want to export the output to .csv or .xlsx files. 我有以下开源代码来生成波纹地址和秘密密钥,但我想将输出导出到.csv或.xlsx文件。 I've tried writing a function by importing the "encoding/csv" package, but I'm not very good with golang, and can't get it to work. 我尝试通过导入“ encoding / csv”包来编写函数,但是我对golang不太满意,无法正常工作。 Any suggestions? 有什么建议么?

I also want it to iterate n number of times to generate as many keys as I want. 我还希望它迭代n次以生成所需数量的密钥。

This is the open-source code from bitbucket.org/dchapes/ripple/cmd/: 这是来自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)
    }
}

and this is the code i tried to embed without success: 这是我尝试嵌入但未成功的代码:

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)
    }
}

Here is an example of what I tried (combining the two) 这是我尝试过的一个例子(将两者结合)

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)
    }
}

To bulk write you can use WriteAll , see full example at https://golang.org/src/encoding/csv/example_test.go 要批量写入,您可以使用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
}

Hi @alon: here is a start of some code for you to look at. @alon,您好:这是一些代码的开头供您查看。 I would say you would get a lot out of some basic go tutorials. 我想说,您将从一些基本的go教程中学到很多东西。 I am not familiar with what you are actually trying to do with this data, as well, but this code generates a csv file with random secrets and some related addresses. 我也不熟悉您实际上要如何处理这些数据,但是这段代码会生成带有随机机密和一些相关地址的csv文件。

It would be helpful for people helping you out to gofmt your source code, that would make it much easier to follow along. 这对帮助您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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM