2017-06-03 26 views
0

我已经使用Golang读取了一个excel csv文件,并希望将它们作为JSON数据打印到Web浏览器中,但是每次打印时Web浏览器中的JSON数据会跳过一些数据。我已经加倍检查这些数据是否在csv文件中,但没有在网页浏览器中打印。任何帮助你可以建议我?由于事先使用Golang将CSV转换为JSON - 在Web浏览器中打印时会跳过一些数据

package main 

import (
"encoding/csv" 
"encoding/json" 
"fmt" 
"github.com/julienschmidt/httprouter" 
"net/http" 
"os" 
) 

var csvData [][]string 
var Record IRIS 
var i int = 0 

func init() { 
    csvFile, err := os.Open("IRIS.csv") 
    if err != nil { 
     fmt.Println(err) 
    } 

    reader := csv.NewReader(csvFile) 
    reader.FieldsPerRecord = -1 
    csvData, _ = reader.ReadAll() 

    if err != nil { 
      fmt.Println(err) 
      os.Exit(1) 
    } 
     defer csvFile.Close() 
} 
type IRIS struct { 
    ID   string 
    SepalLength string 
    SepalWidth string 
    PetalLength string 
    PetalWidth string 
    Species  string 
} 

func main() { 
    router := httprouter.New() 
    router.GET("/stream/content/data", StreamDataHandler) 
    fmt.Println(http.ListenAndServe("127.0.0.1:9090", router)) 
} 
func StreamDataHandler(res http.ResponseWriter, req *http.Request, p  httprouter.Params) { 
    res.Header().Set("Access-Control-Allow-Origin", "*") 

    // read data from CSV file 
    Record.ID = csvData[i][0] 
    Record.SepalLength = csvData[i][1] 
    Record.SepalWidth = csvData[i][2] 
    Record.PetalLength = csvData[i][3] 
    Record.PetalWidth = csvData[i][4] 
    Record.Species = csvData[i][5] 

    jsondata, err := json.Marshal(Record) // convert to JSON 

    if err != nil { 
      fmt.Println(err) 
      os.Exit(1) 
    } 

    i = i + 1 

    fmt.Fprintf(res, string(jsondata)) 
    return 
} 

OUTPUT:

{ “ID”: “2”, “SepalLength”: “4.9”, “SepalWidth”: “3”, “PetalLength”: “1.4”,” PetalLength“:”1.7“,”SepalLength“:”5.4“ “”,“PetalWidth”:“0.4”,“物种”:“setosa”}

{“ID”:“7”,“SepalLength”:“5.7”,“SepalWidth”:“4.4” :“1.5”,“PetalWidth”:“0.4”,“物种”:“setosa”}

。 。 。

为什么会发生这种情况?

我其实想打印的所有值(不跳过任何),如数据的流从Excel CSV每2第二个文件

+0

如果你需要一个全球计数器我推荐你这个https://golang.org/pkg/expvar/#Int –

回答

0

有在你的处理器的竞争条件上访问i制造。多个goroutine将执行i = i + 1声明,从而产生i的几个可能值。一个互斥体的使用应解决这个问题:

// ... 

var i int = 0 
var m sync.Mutex 

// ... 

func StreamDataHandler(res http.ResponseWriter, req *http.Request, p  httprouter.Params) { 
    // ... 

    m.Lock() 
    defer m.Unlock() 
    i = i + 1 

    // ... 
} 

但是,如果你想使用HTTP GET不断获取价值,更好的解决办法是在回应中包含取最后一个索引,并添加此值(增量后它)例如)作为下一个请求中的请求参数来指示下一个需要的索引。这样你就不需要在你的处理程序中维护i

+0

感谢abhink,我喜欢你的好解决方案:)这几乎解决了我的问题。其实我试图用golang服务器和csv数据来模拟传感器(每2秒连续产生一次数据) –