亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在服務器上加載 CSV 數據,將數據轉換為 JSON 并使用 Golang 使用 Json

在服務器上加載 CSV 數據,將數據轉換為 JSON 并使用 Golang 使用 Json

Go
飲歌長嘯 2022-06-27 15:15:59
我正在嘗試構建一個 TCP 服務器,它從CSV文件加載數據集并提供一個接口來查詢數據集。TCP 服務器將暴露 4040 端口。 CSV 文件包含與冠狀病毒病例相關的以下列:累積測試陽性進行的累積測試日期出院已到期錄取區域用戶應該能夠在基于 Linux/Unix 的系統上使用NetCat命令連接到服務器。 nc localhost 4040一旦連接到 TCP,用戶應該能夠通過發送 JSON 格式的查詢與應用程序進行通信。{    "query": {        "region": "Sindh"    }}{    "query": {        "date": "2020-03-20"    }}這會正確加載 csv 并將其轉換為 JSON。但是,當我嘗試使用 NetCat 命令運行查詢時,它返回空 JSON 元素。請指導我哪里出錯了。
查看完整描述

2 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

猜你想要這個:


╭─root@DESKTOP-OCDRD7Q ~

╰─# nc localhost 4040

{"get": "Sindh"}

[{"Covid_Positive":"1","Coivd_Performed":"1","Covid_Date":"1","Covid_Discharged":"1","Covid_Expired":"1","Covid_Region":"Sindh","Covid_Admitted":"1"}]

您應該做的只是修改您的 json 請求。


package main


import (

    "bufio"

    "encoding/csv"

    "encoding/json"

    "flag"

    "fmt"

    "io"

    "log"

    "net"

    "os"

)


type CovidPatient struct {

    Positive   string `json:"Covid_Positive"`

    Performed  string `json:"Coivd_Performed"`

    Date       string `json:"Covid_Date"`

    Discharged string `json:"Covid_Discharged"`

    Expired    string `json:"Covid_Expired"`

    Region     string `json:"Covid_Region"`

    Admitted   string `json:"Covid_Admitted"`

}


type DataRequest struct {

    Get CovidPatient `json:"get"`

}


type DataError struct {

    Error string `json:"Covid_error"`

}


func Load(path string) []CovidPatient {

    table := make([]CovidPatient, 0)

    var patient CovidPatient

    file, err := os.Open(path)

    if err != nil {

        panic(err.Error())

    }

    defer file.Close()


    reader := csv.NewReader(file)

    csvData, err := reader.ReadAll()

    if err != nil {

        fmt.Println(err)

        os.Exit(1)

    }

    for _, row := range csvData {

        patient.Positive = row[0]

        patient.Performed = row[1]

        patient.Date = row[2]

        patient.Discharged = row[3]

        patient.Expired = row[4]

        patient.Region = row[5]

        patient.Admitted = row[6]

        table = append(table, patient)

    }

    return table

}


func Find(table []CovidPatient, filter CovidPatient) []CovidPatient {


    result := make([]CovidPatient, 0)


    log.Println(filter, table)


    for _, cp := range table {


        if filter.Positive == "" {

        } else if filter.Positive != cp.Positive {

            continue

        }

        if filter.Performed == "" {

        } else if filter.Performed != cp.Performed {

            continue

        }

        if filter.Date == "" {

        } else if filter.Date != cp.Date {

            continue

        }

        if filter.Discharged == "" {

        } else if filter.Discharged != cp.Discharged {

            continue

        }

        if filter.Expired == "" {

        } else if filter.Expired != cp.Expired {

            continue

        }

        if filter.Region == "" {

        } else if filter.Region != cp.Region {

            continue

        }

        if filter.Admitted == "" {

        } else if filter.Admitted != cp.Admitted {

            continue

        }


        result = append(result, cp)

    }

    return result


}


var (

    patientsDetail = Load("./covid_final_data.csv")

)


func main() {

    log.SetFlags(log.Lshortfile | log.Ltime)

    var addr string

    var network string

    flag.StringVar(&addr, "e", ":4040", "service endpoint [ip addr or socket path]")

    flag.StringVar(&network, "n", "tcp", "network protocol [tcp,unix]")

    flag.Parse()


    switch network {

    case "tcp", "tcp4", "tcp6", "unix":

    default:

        fmt.Println("unsupported network protocol")

        os.Exit(1)

    }


    ln, err := net.Listen(network, addr)

    if err != nil {

        log.Println(err)

        os.Exit(1)

    }

    defer ln.Close()

    log.Println("Covid19 Condition in Pakistan")

    log.Printf("Service started: (%s) %s\n", network, addr)


    for {

        conn, err := ln.Accept()

        if err != nil {

            log.Println(err)

            conn.Close()

            continue

        }

        log.Println("Connected to ", conn.RemoteAddr())

        go handleConnection(conn)

    }

}

func handleConnection(conn net.Conn) {

    defer func() {

        if err := conn.Close(); err != nil {

            log.Println("error closing connection:", err)

        }

    }()


    reader := bufio.NewReaderSize(conn, 100)


    for {

        buf, err := reader.ReadBytes('|')

        if err != nil {

            if err != io.EOF {

                log.Println("connection read error:", err)

                return

            }

        }

        reader.Reset(conn)


        var req DataRequest

        if err := json.Unmarshal(buf[:len(buf)-1], &req); err != nil {

            log.Println("failed to unmarshal request:", string(buf), err)

            cerr, jerr := json.Marshal(DataError{Error: err.Error()})

            if jerr != nil {

                log.Println("failed to marshal DataError:", jerr)

                continue

            }

            if _, werr := conn.Write(cerr); werr != nil {

                log.Println("failed to write to DataError:", werr)

                return

            }

            continue

        }


        result := Find(patientsDetail, req.Get)


        rsp, err := json.Marshal(&result)

        if err != nil {

            log.Println("failed to marshal data:", err)

            if _, err := fmt.Fprintf(conn, `{"data_error":"internal error"}`); err != nil {

                log.Printf("failed to write to client: %v", err)

                return

            }

            continue

        }

        if _, err := conn.Write(rsp); err != nil {

            log.Println("failed to write response:", err)

            return

        }

    }

}


查詢是:


╭─root@DESKTOP-OCDRD7Q ~

╰─# nc localhost 4040                                                                                             127 ?

{

    "get": {

        "Covid_Region": "Sindh",

        "Covid_Date": "2020-03-20"

    }

}|

[{"Covid_Positive":"1","Coivd_Performed":"1","Covid_Date":"2020-03-20","Covid_Discharged":"1","Covid_Expired":"1","Covid_Region":"Sindh","Covid_Admitted":"1"}]



查看完整回答
反對 回復 2022-06-27
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

在 functionhandleConnection中,第一件事是“讀取直到找到第一個}”,假設用戶正在發送請求:


{ "get": { "Covid_Region": "Sindh", "Covid_Date": "2020-03-20" } }

然后該步驟如下:


{ "get": { "Covid_Region": "Sindh", "Covid_Date": "2020-03-20" }

}請注意缺少尾隨,然后json.Unmarshal嘗試在沒有最后一個的情況下解組查詢}(這是無效的 json)。


這個問題可以利用 JSON 流解碼,換句話說,使用json.NewDecoder(r io.Reader)代替json.Unmarshal. 讓我復制并修改該函數的第一部分:


func handleConnection(conn net.Conn) {

    defer func() {

        if err := conn.Close(); err != nil {

            log.Println("error closing connection:", err)

        }

    }()


    jsonDecoder := json.NewDecoder(conn) // A json decoder read a stream to find a

                                         // valid JSON and stop just the byte

                                         // after the JSON ends. Process can be

                                         // repeated.


    for {

        var req DataRequest

        err := jsonDecoder.Decode(&req)

        if err == io.EOF {

            log.Println("finish")

            return

        }

        if err != nil {

            log.Println("unmarshal:", err)

            return

        }


        result := Find(patientsDetail, req.Get) // Here query the system


        // ... 


可能現在它可以工作了,但是您也可以利用 json 流通過jsonEncoder := json.NewEncoder(conn)before de for 循環發送回響應,并像這樣發送請求:


        err := jsonEncoder.Encode(&result)

        if err != nil {

            log.Println("failed to marshal data:", err)

            // ...

            continue

        }


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號