Robbie, Fixed a typo: https://play.golang.org/p/JbKGJMw4r3
Peter On Friday, February 24, 2017 at 12:48:44 PM UTC-5, peterGo wrote: > > Robbie, > > It's hard to understand what you are doing. > > The header says that there is no grade and sg is not where you say it is. > Why are you using a channel? Why are you limiting the size of your input by > reading the entire file into memory? And so on. > > My best guess is that you want to do something like this: > > Go Playground: https://play.golang.org/p/4Aok43E6AC > > Peter > > On Friday, February 24, 2017 at 8:58:52 AM UTC-5, 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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.