Go:为什么“fmt.Sprintf(”%v,“,lines [i])”将逗号放在新行上?

时间:2017-03-05 14:10:38

标签: go gofmt

这是完整的代码:

files, _ := ioutil.ReadDir("files")
for _, f := range files {
    input, err := ioutil.ReadFile("files/" + f.Name())
    lines := strings.Split(string(input), "\n")

    for i, _ := range lines {
        lines[i] = fmt.Sprintf("%v,", lines[i])
    }

    output := strings.Join(lines, "\n")
    err = ioutil.WriteFile("files/"+f.Name()+"fix", []byte(output), 0644)
    if err != nil {
        log.Fatalln(err)
    }
}

我认为这是因为lines [i]必须在字符串的末尾包含一个换行字节..我试图删除它但是失败了..

我加载的文件只是json文件,例如。

第1行:{ "foo":"bar","baz":null }

第2行:{ "foo":"bar","baz":"quz" }

我试图在所有行的末尾添加一个逗号..任何帮助都将非常感激

为了让自己更清楚一点,我现在得到的是:

{ "foo":"bar","baz":null }
,
{ "foo":"bar","baz":"quz" }
,

而我想得到的是:

{ "foo":"bar","baz":null },
{ "foo":"bar","baz":"quz" },

2 个答案:

答案 0 :(得分:1)

您的JSON数据是否可能来自Windows并且实际上包含/ r / n而不仅仅是/ n?

您可以在this playground example中使用/ r / n看到此行为:

package main

import (
    "fmt"
    "strings"
)

func main() {
    a := "test\r\nnewtest\r\ntest2"
    b := strings.Split(a, "\n")
    c := strings.Join(b, ",\n")
    fmt.Printf("%v", c)

}

答案 1 :(得分:1)

尝试修剪该行以清除它具有的任何尾随的unicode代码点:

import "strings"

// ...

for _, line := range lines {
        line = fmt.Sprintf("%v,", strings.Trim(line, " \r\n"))
}