Go: Почему "fmt.Sprintf("%v ", lines[i])" ставит запятую на новой строке?

Это полный код:

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)
    }
}

Я предполагаю, что это потому, что линии [я] должен содержать байт новой строки в конце строки.. Я пытался удалить его, но не удалось..

Файлы, которые я загружаю, являются просто файлами 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 ответа

Решение

Попробуйте обрезать строку, чтобы очистить все конечные кодовые точки юникода, которые у нее есть:

import "strings"

// ...

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

Возможно ли, что ваши данные JSON поступают из Windows и на самом деле содержат /r/n, а не просто /n?

Вы можете увидеть это поведение, используя /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)

}
Другие вопросы по тегам