我有一个txt文件转储,其中包含以下行格式的数据:
2015/01/01-01:00:00, {'a50': 15.5, 'a95': 14.5, 'a99': 21.5}
我想提取值并将其转换为CSV格式:
2015/01/01, 15.5, 14.5, 21.5
到目前为止,我可以读取文件并提取数据,我也可以使用正则表达式获取时间戳值(但我知道Go中的regexp非常慢),我正在避免使用更多的正则表达式来提取剩余的值。有什么指针吗?
答案 0 :(得分:0)
我可以根据需要使用代码示例来跟进,我的时间允许,但这是我将如何解决问题的基本概述。
1)创建一个类似下面的类型来保存您的数据;
type line struct {
A50 float64 `json:"a50"`
A95 float64 `json:"a95"`
A99 float64 `json:"a99"`
}
2)逐行读取输入
3)对于每一行使用strings.Index
来获取第一个逗号的索引
4)将字符串的后半部分传递给json.Unmarshal,通过子句式传递;
err := json.Unmarshal([]byte(line[20:]), &MyInstance)
5)使用Sprintf将所需的输出写入磁盘或缓冲区,如此;
output := fmt.Sprintf("%s, %f, %f, %f\n", line[0:20], MyInstance.A50, MyInstance.A95, MyInstance.A99)
编辑:注意到一个小错误。您正在修改日期时间之外的时间部分,您可以使用strings.Index
并再次进行处理或strings.Split
分隔两个令牌来获取该时间部分。
我应该指出的另一件事是我没有包含任何文件处理代码。您处理的方式取决于您的需求。例如,如果它是少量数据,我可能会将所有输出保存在内存中,然后将其写入磁盘,如果数据源很大,则必须完成所有这些操作。流式时尚(意味着每一行都独立于其余部分进行处理)。