Golang:将文本转储转换为CSV

时间:2015-10-05 22:52:27

标签: csv go

我有一个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非常慢),我正在避免使用更多的正则表达式来提取剩余的值。有什么指针吗?

1 个答案:

答案 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分隔两个令牌来获取该时间部分。

我应该指出的另一件事是我没有包含任何文件处理代码。您处理的方式取决于您的需求。例如,如果它是少量数据,我可能会将所有输出保存在内存中,然后将其写入磁盘,如果数据源很大,则必须完成所有这些操作。流式时尚(意味着每一行都独立于其余部分进行处理)。