英文:
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 <Spawnable>
# 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:"name"`
SpawnWindowBegins string `json:"spawnWindowBegins"`
TimeTilWindow string `json:"timeTilWindow"`
}
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 && 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)
Output:
{"name":"Red Nose","spawnWindowBegins":"Mon, 06:45 EST - Mon, 15:15 EST","timeTilWindow":"Spawnable || in X hours"}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论