Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1.  
  2. package main
  3.  
  4. import (
  5. "encoding/csv"
  6. "fmt"
  7. "io"
  8. "os"
  9. "strconv"
  10. "strings"
  11.  
  12. "code.google.com/p/go.text/encoding/japanese"
  13. "code.google.com/p/go.text/transform"
  14. )
  15.  
  16. func noErrorOrPanic(err error) {
  17. if err != nil {
  18. panic(err)
  19. }
  20. }
  21.  
  22. func validate(records [][]string) {
  23. if len(records) == 0 {
  24. panic("ファイルが空っすね")
  25. }
  26. }
  27.  
  28. func main() {
  29. if len(os.Args) < 2 {
  30. panic("ファイルを指定してください")
  31. }
  32. file, err := os.Open(os.Args[1])
  33.  
  34. noErrorOrPanic(err)
  35. defer file.Close()
  36.  
  37. reader := csv.NewReader(transform.NewReader(file, japanese.ShiftJIS.NewDecoder()))
  38.  
  39. var records [][]string
  40. for {
  41. record, err := reader.Read()
  42. if err == io.EOF {
  43. break
  44. } else {
  45. noErrorOrPanic(err)
  46. }
  47.  
  48. records = append(records, record)
  49. }
  50.  
  51. validate(records)
  52. header, data := records[:1][0], records[1:]
  53.  
  54. // 転置
  55. var vs [][]float64 = make([][]float64, len(header))
  56. for _, row := range data {
  57. for col := 0; col < len(header); col++ {
  58. if v, err := strconv.ParseFloat(strings.Trim(row[col], " "), 64); err == nil {
  59. vs[col] = append(vs[col], v)
  60. }
  61. }
  62. }
  63.  
  64. output, err := os.Create(file.Name() + ".calc.csv")
  65. defer output.Close()
  66. writer := csv.NewWriter(transform.NewWriter(output, japanese.ShiftJIS.NewEncoder()))
  67.  
  68. writer.Write(append(header, "計算結果"))
  69.  
  70. toStrs := func(nums []float64) []string {
  71. ss := []string{}
  72. for _, n := range nums {
  73. ss = append(ss, fmt.Sprintf("%.4f", n))
  74. }
  75. return ss
  76. }
  77.  
  78. multipleAll := func(nums []float64) {
  79. r := 1.0
  80.  
  81. for _, n := range nums {
  82. r = r * n
  83. }
  84. writer.Write(toStrs(append(nums, r)))
  85. }
  86.  
  87. var d []float64
  88. walk(vs, d, multipleAll)
  89.  
  90. writer.Flush()
  91. }
  92.  
  93. func walk(datas [][]float64, currentDatas []float64, proc func([]float64)) {
  94. currentLevelDatas, nextLevelDatas := datas[:1][0], datas[1:]
  95. if len(nextLevelDatas) == 0 {
  96. for _, each := range currentLevelDatas {
  97. ds := append(currentDatas, each)
  98. proc(ds)
  99. }
  100. return
  101. }
  102.  
  103. for _, each := range currentLevelDatas {
  104. ds := append(currentDatas, each)
  105. walk(nextLevelDatas, ds, proc)
  106. }
  107.  
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement