395 |
395 |
396 func main() { |
396 func main() { |
397 inFile := flag.String([]string{"-input-file", "i"}, "", "Input JSON file") |
397 inFile := flag.String([]string{"-input-file", "i"}, "", "Input JSON file") |
398 outFile := flag.String([]string{"-output-file", "o"}, "", "Output JSON file") |
398 outFile := flag.String([]string{"-output-file", "o"}, "", "Output JSON file") |
399 limit := flag.Uint([]string{"-limit", "l"}, 0, "Limit number of items to N first") |
399 limit := flag.Uint([]string{"-limit", "l"}, 0, "Limit number of items to N first") |
400 since := flag.String([]string{"-since"}, "", |
400 before := flag.String([]string{"-before"}, "", |
|
401 "Filter records before date (YYYY-mm-dd HH:MM:SS)") |
|
402 since := flag.String([]string{"-since", "-after"}, "", |
401 "Filter records from date (YYYY-mm-dd HH:MM:SS)") |
403 "Filter records from date (YYYY-mm-dd HH:MM:SS)") |
402 format := flag.String([]string{"-format", "f"}, "", "Output format (csv, json)") |
404 format := flag.String([]string{"-format", "f"}, "", "Output format (csv, json)") |
403 avg := flag.Bool([]string{"-average", "a"}, false, "Compute average") |
405 avg := flag.Bool([]string{"-average", "a"}, false, "Compute average") |
404 stats := flag.Bool([]string{"-stats"}, false, "Compute statistics") |
406 stats := flag.Bool([]string{"-stats"}, false, "Compute statistics") |
405 merge := flag.Bool([]string{"-merge", "m"}, false, |
407 merge := flag.Bool([]string{"-merge", "m"}, false, |
442 startDate, err := parseDate(*since) |
444 startDate, err := parseDate(*since) |
443 if err != nil { |
445 if err != nil { |
444 log.Fatal("Could not parse date: ", err) |
446 log.Fatal("Could not parse date: ", err) |
445 } |
447 } |
446 |
448 |
|
449 endDate, err := parseDate(*before) |
|
450 if err != nil { |
|
451 log.Fatal("Could not parse date: ", err) |
|
452 } |
|
453 |
447 var items []measurement |
454 var items []measurement |
448 |
455 |
449 // Read data |
456 // Read data |
450 |
457 |
451 if *inFile == "" { |
458 if *inFile == "" { |
482 break |
489 break |
483 } |
490 } |
484 } |
491 } |
485 } |
492 } |
486 |
493 |
|
494 if !endDate.IsZero() { |
|
495 log.Printf("Filtering out records after %v...\n", endDate) |
|
496 for i := range items { |
|
497 iDate := time.Date(items[i].Year, time.Month(items[i].Month), |
|
498 items[i].Day, items[i].Hour, items[i].Minute, 0, 0, |
|
499 time.Local) |
|
500 if iDate.Sub(endDate) <= 0 { |
|
501 items = items[i:] |
|
502 break |
|
503 } |
|
504 } |
|
505 } |
|
506 |
487 if *fromTime != "" || *toTime != "" { |
507 if *fromTime != "" || *toTime != "" { |
488 log.Println("Filtering hours...") |
508 log.Println("Filtering hours...") |
489 |
509 |
490 compare := func(m measurement, t simpleTime) int { |
510 compare := func(m measurement, t simpleTime) int { |
491 if m.Hour*60+m.Minute < t.hour*60+t.minute { |
511 if m.Hour*60+m.Minute < t.hour*60+t.minute { |