我对Go有点新,但我正在尝试用逗号替换我的字符串的每个第n个实例。例如,我的部分数据如下所示:
"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,
我想将every 6th comma
替换为'\n'
,因此它看起来像
"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769"
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506"
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991"
我查看了regexp
包,这似乎只是一个查找器。 strings
包确实有替换,但我不知道如何使用它来替换特定的索引。我也不知道如何找到特定的索引而不经过整个字符串逐个字符。我想知道是否有一个比我编写辅助函数更优雅的regEx解决方案。
字符串是不可变的,因此我无法在适当的位置编辑它们。
编辑:将字符串转换为[]字节。这允许我在适当的位置编辑字符串。然后其余的是一个相当简单的for循环,其中dat
是数据。
答案 0 :(得分:1)
如果这是您的输入,则应将,"
字符串替换为\n"
。您可以使用strings.Replace()
进行此操作。这将留下最后一个尾随的逗号,您可以使用切片删除它。
解决方案:
in := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,`
out := strings.Replace(in, ",\"", "\n\"", -1)
out = out[:len(out)-1]
fmt.Println(out)
输出是(在Go Playground上尝试):
"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991
答案 1 :(得分:1)
如果你想要灵活。
package main
import (
"fmt"
"strings"
)
func main() {
input := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,`
var result []string
for len(input) > 0 {
token := strings.SplitN(input, ",", 7)
s := strings.Join(token[0:6], ",")
result = append(result, s)
input = input[len(s):]
input = strings.Trim(input, ",")
}
fmt.Println(result)
}
答案 2 :(得分:1)
所以我弄清楚我做错了什么。我最初将数据作为string
,但如果我将其转换为byte[]
,那么我可以将其更新到位。
这允许我使用下面的简单for
循环来解决问题,而不依赖于除第n个字符实例之外的任何其他指标
for i := 0; i < len(dat); i++ {
if dat[i] == ',' {
count += 1
}
if count%6 == 0 && dat[i] == ',' {
dat[i] = '\n'
count = 0
}