示例#1
0
// GetAgeModle function for evaluate janus calls
func GetAgeModle(request *restful.Request, response *restful.Response) {
	conn, err := connectors.GetJanusConX() // get the Oracle connection
	if err != nil {
		log.Print(err)
	}
	defer conn.Close()

	sqlstring := `SELECT * FROM ocd_age_model WHERE leg = 138 AND site = 844 AND hole = 'B'`

	// Call to Struct based version
	data := &[]AgeModel{}
	GetAgeModelData(conn, sqlstring, &data)
	csvContent, err := gocsv.MarshalString(data) // Get all clients as CSV string
	if err != nil {
		log.Print(err)
	}

	response.Header().Set("Content-Type", "text/csv") // setting the content type header to text/csv
	response.Header().Set("Content-Disposition", "attachment;filename=ocdDataDownload.csv")
	response.Write([]byte(fmt.Sprintf("%v", csvContent)))
}
func main() {
	//var url = "http://localhost:8000/perf.html" // python -m SimpleHTTPServer
	var DEFAULT_URL = "http://www.ptv.vic.gov.au/about-ptv/ptv-data-and-reports/daily-operational-performance-reports/"
	var format string
	var url string

	flag.StringVar(&format, "format", "json", "--format json,csv")
	flag.StringVar(&url, "url", DEFAULT_URL, "--url <path to PTV perf data>")
	flag.Parse()

	resp, err := http.Get(url)

	if err != nil {
		log.Fatalf("Error reading performance data: %s", err.Error())
	}

	doc, err := html.Parse(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	types := map[int]string{1: "train", 2: "tram", 3: "v/line"}
	values := make(map[int][][]string, 0)

	i := 0    // How many tables we've gone through
	rows := 0 // how many rows in table
	var f func(*html.Node)
	f = func(n *html.Node) {
		if n.Type == html.ElementNode && n.Data == "table" {
			if values[i] == nil {
				values[i] = make([][]string, 1)
				values[i][0] = make([]string, 3)
			}
			i++
			rows = 0
		}
		if n.Type == html.ElementNode && n.Data == "tr" {
			values[i] = append(values[i], make([]string, 0))

			rows++
		}
		if n.Type == html.ElementNode && (n.Data == "th" || n.Data == "td") && rows > 2 {
			values[i][rows-2] = append(values[i][rows-2], n.FirstChild.Data)
		}
		for c := n.FirstChild; c != nil; c = c.NextSibling {
			f(c)
		}
	}
	f(doc)

	if len(values) != 4 {
		log.Fatalf("Error reading performance data, only have %d values: %s", len(values), values)
	}

	data := make([]PerformanceData, 0)

	for i, transportValues := range values {
		if len(transportValues) > 0 {
			for _, dataSet := range transportValues {
				if len(dataSet) >= 3 && dataSet[0] != "" {
					date, e := time.Parse("Monday, 2 January 2006", dataSet[0])
					dateFmt := fmt.Sprintf("%d-%d-%d", date.Year(), date.Month(), date.Day())
					failOnErr(e)
					delivery, e := strconv.ParseFloat(strings.Replace(dataSet[1], "%", "", -1), 64)
					failOnErr(e)
					punctuality, e := strconv.ParseFloat(strings.Replace(dataSet[2], "%", "", -1), 64)
					failOnErr(e)
					data = append(data, PerformanceData{Delivery: delivery, Punctuality: punctuality, Date: dateFmt, TransportType: types[i]})
				}

			}
		}

	}

	switch format {
	case "json":
		d, err := json.Marshal(data)
		failOnErr(err)
		fmt.Printf("%s", string(d))
	case "csv":
		csvContent, err := gocsv.MarshalString(&data) // Get all clients as CSV string
		failOnErr(err)
		fmt.Println(csvContent)
	}
}