当前位置:首页 > 文章列表 > Golang > Go问答 > 在服务器上加载 CSV 数据,将数据转换为 JSON 并使用 Golang 使用 Json 查询获取结果

在服务器上加载 CSV 数据,将数据转换为 JSON 并使用 Golang 使用 Json 查询获取结果

来源:stackoverflow 2024-04-19 08:18:37 0浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《在服务器上加载 CSV 数据,将数据转换为 JSON 并使用 Golang 使用 Json 查询获取结果》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我正在尝试构建一个 tcp 服务器,从 csv 文件加载数据集并提供查询数据集的接口。 tcp 服务器将公开端口 4040。csv 文件包含与冠状病毒案例相关的以下列:

  • 累计检测呈阳性
  • 执行的累积测试
  • 日期
  • 出院
  • 已过期
  • 已录取
  • 地区 用户应该能够在基于 linux/unix 的系统上使用 netcat nc localhost 4040 命令连接到服务器。

连接到 tcp 后,用户应该能够通过发送 json 格式的查询来与应用程序进行通信。

{
    "query": {
        "region": "sindh"
    }
}
{
    "query": {
        "date": "2020-03-20"
    }
}

我的server.go

package main

import (
    "fmt"
    "net"
    "os"
    "flag"
    "log"
    "encoding/csv"
    "encoding/json"
    "bufio"
    "io"
    "strings"
)

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 string `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 string) []CovidPatient {
    if filter == "" || filter == "*" {
        return table
    }
    result := make([]CovidPatient, 0)
    filter = strings.ToUpper(filter)
    for _, cp := range table {
        if cp.Date == filter ||
            cp.Region == filter ||
            strings.Contains(strings.ToUpper(cp.Positive), filter)      ||
            strings.Contains(strings.ToUpper(cp.Performed), filter)     ||
            strings.Contains(strings.ToUpper(cp.Date), filter)          ||
            strings.Contains(strings.ToUpper(cp.Discharged), filter)    ||
            strings.Contains(strings.ToUpper(cp.Expired), filter)       ||
            strings.Contains(strings.ToUpper(cp.Region), filter)        ||
            strings.Contains(strings.ToUpper(cp.Admitted), filter){
            result = append(result, cp)
        }
    }
    return result
}

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

func main(){
    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, 4)

    for {
        buf, err := reader.ReadSlice('}')
        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, &req); err != nil {
            log.Println("failed to unmarshal request:", 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
        }
    }
}

这会正确加载 csv 并将其转换为 json。但是,当我尝试使用 netcat 命令运行查询时,它返回空 json 元素。请指导我哪里有错误。


解决方案


我猜你想要这个:

╭─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"}]

以上就是《在服务器上加载 CSV 数据,将数据转换为 JSON 并使用 Golang 使用 Json 查询获取结果》的详细内容,更多关于的资料请关注golang学习网公众号!

版本声明
本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
苹果春季新品预告:Apple Watch表带将迎来全新色彩系列苹果春季新品预告:Apple Watch表带将迎来全新色彩系列
上一篇
苹果春季新品预告:Apple Watch表带将迎来全新色彩系列
BigQuery 创建计划查询
下一篇
BigQuery 创建计划查询
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 毕业宝AIGC检测:AI生成内容检测工具,助力学术诚信
    毕业宝AIGC检测
    毕业宝AIGC检测是“毕业宝”平台的AI生成内容检测工具,专为学术场景设计,帮助用户初步判断文本的原创性和AI参与度。通过与知网、维普数据库联动,提供全面检测结果,适用于学生、研究者、教育工作者及内容创作者。
    6次使用
  • AI Make Song:零门槛AI音乐创作平台,助你轻松制作个性化音乐
    AI Make Song
    AI Make Song是一款革命性的AI音乐生成平台,提供文本和歌词转音乐的双模式输入,支持多语言及商业友好版权体系。无论你是音乐爱好者、内容创作者还是广告从业者,都能在这里实现“用文字创造音乐”的梦想。平台已生成超百万首原创音乐,覆盖全球20个国家,用户满意度高达95%。
    26次使用
  • SongGenerator.io:零门槛AI音乐生成器,快速创作高质量音乐
    SongGenerator
    探索SongGenerator.io,零门槛、全免费的AI音乐生成器。无需注册,通过简单文本输入即可生成多风格音乐,适用于内容创作者、音乐爱好者和教育工作者。日均生成量超10万次,全球50国家用户信赖。
    21次使用
  •  BeArt AI换脸:免费在线工具,轻松实现照片、视频、GIF换脸
    BeArt AI换脸
    探索BeArt AI换脸工具,免费在线使用,无需下载软件,即可对照片、视频和GIF进行高质量换脸。体验快速、流畅、无水印的换脸效果,适用于娱乐创作、影视制作、广告营销等多种场景。
    26次使用
  • SEO标题协启动:AI驱动的智能对话与内容生成平台 - 提升创作效率
    协启动
    SEO摘要协启动(XieQiDong Chatbot)是由深圳协启动传媒有限公司运营的AI智能服务平台,提供多模型支持的对话服务、文档处理和图像生成工具,旨在提升用户内容创作与信息处理效率。平台支持订阅制付费,适合个人及企业用户,满足日常聊天、文案生成、学习辅助等需求。
    25次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码