main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package main
  2. import (
  3. "os"
  4. "fmt"
  5. "time"
  6. "encoding/binary"
  7. "code.google.com/p/getopt"
  8. "devel.mephi.ru/dyokunev/voltlogger_parser/voltloggerParser"
  9. )
  10. type printRow_arg struct {
  11. outputPath string
  12. outputFile *os.File
  13. binaryOutput bool
  14. insertParseTime bool
  15. }
  16. func handleHeader(h voltloggerParser.VoltloggerDumpHeader, arg_iface interface{}) (err error) {
  17. arg := arg_iface.(*printRow_arg)
  18. if (arg.binaryOutput) {
  19. err = binary.Write(arg.outputFile, binary.LittleEndian, h)
  20. if (err != nil) {
  21. return err
  22. }
  23. }
  24. return nil
  25. }
  26. func printRow(ts int64, row []int32, h voltloggerParser.VoltloggerDumpHeader, arg_iface interface{}) (err error) {
  27. arg := arg_iface.(*printRow_arg)
  28. var parseTime int64
  29. if (arg.insertParseTime) {
  30. parseTime = time.Now().UnixNano()
  31. }
  32. if (arg.binaryOutput) {
  33. if (arg.insertParseTime) {
  34. err = binary.Write(arg.outputFile, binary.LittleEndian, parseTime)
  35. if (err != nil) {
  36. return err
  37. }
  38. }
  39. err = binary.Write(arg.outputFile, binary.LittleEndian, ts)
  40. if (err != nil) {
  41. return err
  42. }
  43. err = binary.Write(arg.outputFile, binary.LittleEndian, row)
  44. if (err != nil) {
  45. return err
  46. }
  47. } else {
  48. if (arg.insertParseTime) {
  49. fmt.Printf("%v\t", parseTime)
  50. }
  51. fmt.Printf("%v", ts)
  52. rowLen := len(row)
  53. for i:=0; i < rowLen; i++ {
  54. fmt.Printf("\t%v", row[i])
  55. }
  56. fmt.Printf("\n")
  57. }
  58. return nil
  59. }
  60. func main() {
  61. var err error
  62. var dumpPath string
  63. var noHeaders bool
  64. var printRow_arg printRow_arg
  65. var channelsNum int
  66. getopt.StringVar(&dumpPath, 'i', "dump-path" )
  67. getopt.StringVar(&printRow_arg.outputPath, 'o', "output-path" ).SetOptional()
  68. getopt.BoolVar (&noHeaders, 'n', "no-headers" ).SetOptional()
  69. getopt.IntVar (&channelsNum, 'c', "force-channels-num" ).SetOptional()
  70. getopt.BoolVar (&printRow_arg.binaryOutput, 'b', "binary-output" ).SetOptional()
  71. getopt.BoolVar (&printRow_arg.insertParseTime, 't', "insert-parse-time" ).SetOptional()
  72. getopt.Parse()
  73. if (getopt.NArgs() > 0 || dumpPath == "") {
  74. getopt.Usage()
  75. os.Exit(-2)
  76. }
  77. switch (printRow_arg.outputPath) {
  78. /* case "":
  79. now := time.Now()
  80. year, month, day := now.Date()
  81. hour, min, sec := now.Clock()
  82. printRow_arg.outputPath = fmt.Sprintf("%v_%v-%02v-%02v_%02v:%02v:%02v.csv", h.DeviceName, year, int(month), day, hour, min, sec)
  83. break*/
  84. case "", "-":
  85. printRow_arg.outputPath = "/dev/stdout"
  86. printRow_arg.outputFile = os.Stdout
  87. break
  88. default:
  89. printRow_arg.outputFile,err = os.Open(printRow_arg.outputPath)
  90. panic(fmt.Errorf("Not supported yet"))
  91. }
  92. if (err != nil) {
  93. fmt.Printf("Cannot open output file: %v", err.Error())
  94. os.Exit(-1)
  95. }
  96. //if (printRow_arg.binaryOutput) {
  97. // err = binary.Write(printRow_arg.outputFile, binary.LittleEndian, printRow_arg)
  98. //}
  99. err = voltloggerParser.ParseVoltloggerDump(dumpPath, noHeaders, channelsNum, handleHeader, printRow, &printRow_arg)
  100. if (err != nil) {
  101. fmt.Printf("Cannot parse the dump: %v\n", err.Error())
  102. os.Exit(-1)
  103. }
  104. printRow_arg.outputFile.Close()
  105. fmt.Printf("%v %v\n", dumpPath, printRow_arg)
  106. }