Hi,

to summarize, it is an ETL, 
just took your case as an example for my experiments here
https://github.com/mh-cbon/poc-pipe



// demo csv read/write.
func csvdemo() {

        // f, err := os.Open("C:/ORIG.csv")
        // if err != nil {
        //      panic(err)
        // }
        var b bytes.Buffer
        b.Write([]byte(csvdata))

        src := t.NewCsvReader(&b)
        src.
                Pipe(&processCsvRecords{}).
                Pipe(&t.CsvWriter{}).
                Pipe(t.NewBytesPrefixer("", "\n")).
                Sink(t.NewByteSink(os.Stdout))

        if err := src.Consume(); err != nil {
                panic(err)
        }

}

// Calculate economic block value given a 40x20x12 block of density sg and grade
func calculateE(sg float64, grade float64) float64 {
        return 40 * 20 * 12 * sg * grade * 80 / 10 * 0.66
}

type processCsvRecords struct {
        t.StringSliceStream
        d bool
}

func (p *processCsvRecords) Write(rec []string) error {

        // rewrite headers
        if !p.d {
                p.d = true
                return p.StringSliceStream.Write(
                        []string{"set", "headers", "as", "you", "d", "like", 
"it"},
                )
        }
        if len(rec) < 17 {
                return fmt.Errorf("Line too short %#v", rec)
        }

        sg, _ := strconv.ParseFloat(rec[17], 64)
        grade, _ := strconv.ParseFloat(rec[13], 64)

        if grade < 0 {
                grade = 0
        } else {
                grade = 0.1 * grade
        }
        if sg < 0 {
                sg = 0
        }
        // fmt.Println(grade)
        // get economic block value
        e := calculateE(sg, grade)
        gradeStr := strconv.FormatFloat(grade, 'f', 8, 64)
        sgStr := strconv.FormatFloat(sg, 'f', 8, 64)
        eStr := strconv.FormatFloat(e, 'f', 8, 64)
        return p.StringSliceStream.Write(
                append(rec[0:4], eStr, sgStr, gradeStr),
        )
}

// 500mb csv with head of the data looks like:
const csvdata = 
`xcentre,ycentre,zcentre,xlength,ylength,zlength,fe_percent,fe_recovery,oxide,rescat,sg,mat_type_8,fillpc,mass_recovery,mass_recovery_percent,air,al2o3,cao,k2o,loi,mgo,mno,phos,sio2,tio2
556960.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
557000.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
556960.000,6320000.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
557000.000,6320000.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
556960.000,6319980.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
557000.000,6319980.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
556960.000,6320000.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
557000.000,6320000.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
557040.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
`





On Friday, February 24, 2017 at 2:58:52 PM UTC+1, Robbie Wright wrote:
>
> Hi this is my first go program and I am looking for some feedback and help 
> writing buffer to csv. To give you an idea of the structure of the data I 
> have run head on the input file gives output seen at the bottom.
>
> package main
>
> import (
>        "bytes"
>        "encoding/csv"
>        "fmt"
>        "io"
>        "log"
>        "strconv"
>        "strings"
>        "bufio"
>        "io/ioutil"
> )
>
> // Calculate economic block value given a 40x20x12 block of density sg and 
> grade
> func calculateE(sg float64, grade float64) float64 {
>        return 40 * 20 * 12 * sg * grade * 80 / 10 * 0.66
> }
>
> // Credit: Stack Overflow
> func processCSV(rc io.Reader) (ch chan []string) {
>        ch = make(chan []string, 10)
>        go func() {
>               r := csv.NewReader(rc)
>               if _, err := r.Read(); err != nil { //read header
>                      log.Fatal(err)
>               }
>               defer close(ch)
>               for {
>                      rec, err := r.Read()
>
>                      if err != nil {
>                             if err == io.EOF {
>                                    break
>                             }
>                             log.Fatal(err)
>
>                      }
>                      ch <- rec
>               }
>        }()
>        return
> }
>
> // Credit: Stack Overflow
> func Readln(r *bufio.Reader) (string, error) {
>        var (
>               isPrefix bool  = true
>               err      error = nil
>               line, ln []byte
>        )
>        for isPrefix && err == nil {
>               line, isPrefix, err = r.ReadLine()
>               ln = append(ln, line...)
>        }
>        return string(ln), err
> }
>
> func main() {
>        var buf bytes.Buffer
>
>        w := csv.NewWriter(&buf)
>        file := "C:/ORIG.csv"
>        dat, _ := ioutil.ReadFile(file)
>        f := string(dat)
>
>        for rec := range processCSV(strings.NewReader(f)) {
>               sg, err := strconv.ParseFloat(rec[17], 64)
>               grade, err := strconv.ParseFloat(rec[13], 64)
>
>               if grade < 0 {
>                      grade = 0
>               } else {
>                      grade = 0.1*grade
>               }
>               if sg < 0 {
>                      sg = 0
>               }
>               fmt.Println(grade)
>               // get economic block value
>               e := calculateE(sg, grade)
>               gradeStr := strconv.FormatFloat(grade, 'f', 8, 64)
>               sgStr := strconv.FormatFloat(sg, 'f', 8, 64)
>               eStr := strconv.FormatFloat(e, 'f', 8, 64)
>               rec := append(rec[0:4], eStr, sgStr, gradeStr)
>               if err = w.Write(rec); err != nil {
>                      log.Fatal(err)
>               }
>        }
>        w.Flush()
>        if err := w.Error(); err != nil {
>               log.Fatal(err)
>        }
>        //fmt.Println(buf.String())
>        //f2, err := os.Create("C:/Users/root/result.csv")
>        //defer f2.Close()
>        //writer := csv.NewWriter(f2)
>        //writer.Write(buf.String())
> }
>
> // 500mb csv with head of the data looks like:
> const data = 
> `xcentre,ycentre,zcentre,xlength,ylength,zlength,fe_percent,fe_recovery,oxide,rescat,sg,mat_type_8,fillpc,mass_recovery,mass_recovery_percent,air,al2o3,cao,k2o,loi,mgo,mno,phos,sio2,tio2
> 556960.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 557000.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 556960.000,6320000.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 557000.000,6320000.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 556960.000,6319980.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 557000.000,6319980.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 556960.000,6320000.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 557000.000,6320000.000,-1088.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,100,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> 557040.000,6319980.000,-1100.000,40.000,20.000,12.000,-99.00000000,66.00000000,-99,4,2.84999990,2,91,0.00000000,0.00000000,0,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
> `
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to