How can I parse text and format it to send it as json data

huangapple go评论110阅读模式
英文:

How can I parse text and format it to send it as json data

问题

我正在创建一个 Discord 机器人,它在一个非常受欢迎的视频游戏服务器上的一个频道上监听消息。他们在那里有一个机器人,通过大多数命令手动控制,用于宣布某些事情,比如 BOSS 的刷新。以下是文本的示例:

# 红鼻子
周一,06:45 EST - 周一,15:15 EST <可刷新>

# 库图姆
周一,09:25 EST - 周一,17:55 EST [窗口开始](2 小时后)

# 卡兰达
周一,09:50 EST - 周一,14:20 EST [窗口开始](3 小时后)

# 恶棍贝格
周一,11:15 EST - 周一,19:45 EST [窗口开始](4 小时后)

# 努沃勒
周一,12:30 EST - 周一,18:00 EST [窗口开始](6 小时后)

# 克萨卡
周一,14:10 EST - 周一,18:40 EST [窗口开始](7 小时后)

# 黑暗树灵
周一,15:50 EST - 周二,00:20 EST [窗口开始](9 小时后)

# 巨型泥怪
周一,16:55 EST - 周二,01:25 EST [窗口开始](10 小时后)

我已经成功连接到服务器并能够读取聊天消息,但我想知道最干净的方法来解析这些数据。我将按以下格式对数据进行格式化:

type Boss struct {
    Name              string `json:"name"`
    SpawnWindowBegins string `json:"spawnWindowBegins"`
    TimeTilWindow     string `json:"timeTilWindow"`
}

例如,我需要解析:

Name = 红鼻子
SpawnWindowBegins = 周一,06:45 EST - 周一,15:15 EST
TimeTilWindow = 可刷新 || X 小时后

这样我就可以通过 WebSocket 将数据发送到我的网站,并进行处理。我可以做到这一点,只是不确定最佳的方法来可靠地将该文本解析为结构体。谢谢。

英文:

I'm creating a Discord bot that listens on a channel in a very popular video games server, they have a bot in there that is manually commanded by majority commands to announce certain things like boss spawns. Here is an example of the text:

# Red Nose
Mon, 06:45 EST - Mon, 15:15 EST &lt;Spawnable&gt;

# Kutum
Mon, 09:25 EST - Mon, 17:55 EST [Window begins](in 2 hours)

# Karanda
Mon, 09:50 EST - Mon, 14:20 EST [Window begins](in 3 hours)

# Dastard Bheg
Mon, 11:15 EST - Mon, 19:45 EST [Window begins](in 4 hours)

# Nouver
Mon, 12:30 EST - Mon, 18:00 EST [Window begins](in 6 hours)

# Kzarka
Mon, 14:10 EST - Mon, 18:40 EST [Window begins](in 7 hours)

# Dim Tree Spirit
Mon, 15:50 EST - Tue, 00:20 EST [Window begins](in 9 hours)

# Giant Mudster
Mon, 16:55 EST - Tue, 01:25 EST [Window begins](in 10 hours)

I have my bot connected to the server and reading chat messages just fine, but I'm wondering what the cleanest way to parse this data would be. I'm going to have the data formatted like so:

type Boss struct {
	Name              string `json:&quot;name&quot;`
	SpawnWindowBegins string `json:&quot;spawnWindowBegins&quot;`
	TimeTilWindow     string `json:&quot;timeTilWindow&quot;`
}

So for example I need to parse

Name = Red Nose
SpawnWindowBegins = Mon, 06:45 EST - Mon, 15:15 EST
TimeTilWindow = Spawnable || in X hours

So that I can send the data through a websocket to my site and process that which I can do just fine I'm just not sure the best way to parse that text into a struct, reliably. Thanks.

答案1

得分: 2

一般情况下,我建议使用正则表达式来进行这种类型的解析。创建一个正则表达式来识别你的键,然后根据需要修补你的数据结构。

nameValueParseRegex := regexp.MustCompile(`^(.*) = (.*)$?\z`)

lines := []string{
    `Name = Red Nose`,
    `SpawnWindowBegins = Mon, 06:45 EST - Mon, 15:15 EST`,
    `Wrong format line`,
    `TimeTilWindow = Spawnable || in X hours`,
}

boss := Boss{}
for _, value := range lines {
    lineResult := nameValueParseRegex.FindAllStringSubmatch(value, -1)

    if lineResult != nil && len(lineResult) > 0 {

        if lineResult[0][1] == "Name" {
            boss.Name = lineResult[0][2]
        }

        if lineResult[0][1] == "SpawnWindowBegins" {
            boss.SpawnWindowBegins = lineResult[0][2]
        }

        if lineResult[0][1] == "TimeTilWindow" {
            boss.TimeTilWindow = lineResult[0][2]
        }

    }

}

s, _ := json.Marshal(boss)
fmt.Printf("%s", s)

输出:

{"name":"Red Nose","spawnWindowBegins":"Mon, 06:45 EST - Mon, 15:15 EST","timeTilWindow":"Spawnable || in X hours"}
英文:

In general I would recommend using a regex to do this type of parsing. Create a regex to identify your keys and then patch your data structure as needed.

nameValueParseRegex := regexp.MustCompile(`^(.*) = (.*)$?\z`)

lines := []string{
	`Name = Red Nose`,
	`SpawnWindowBegins = Mon, 06:45 EST - Mon, 15:15 EST`,
	`Wrong format line`,
	`TimeTilWindow = Spawnable || in X hours`,
}

boss := Boss{}
for _, value := range lines {
	lineResult := nameValueParseRegex.FindAllStringSubmatch(value, -1)

	if lineResult != nil &amp;&amp; len(lineResult) &gt; 0 {

		if lineResult[0][1] == &quot;Name&quot; {
			boss.Name = lineResult[0][2]
		}

		if lineResult[0][1] == &quot;SpawnWindowBegins&quot; {
			boss.SpawnWindowBegins = lineResult[0][2]
		}

		if lineResult[0][1] == &quot;TimeTilWindow&quot; {
			boss.TimeTilWindow = lineResult[0][2]
		}

	}

}

s, _ := json.Marshal(boss)
fmt.Printf(&quot;%s&quot;, s)

Output:

{&quot;name&quot;:&quot;Red Nose&quot;,&quot;spawnWindowBegins&quot;:&quot;Mon, 06:45 EST - Mon, 15:15 EST&quot;,&quot;timeTilWindow&quot;:&quot;Spawnable || in X hours&quot;}

huangapple
  • 本文由 发表于 2017年3月6日 20:05:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/42625210.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定