Почему 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)
    }
}

Я предполагаю, что это потому, что строки [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" },

person fisker    schedule 05.03.2017    source источник
comment
Распечатайте строки в кавычках или необработанные байтовые данные и посмотрите, что именно происходит на каждом этапе.   -  person JimB    schedule 05.03.2017


Ответы (2)


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

import "strings"

// ...

for _, line := range lines {
        line = fmt.Sprintf("%v,", strings.Trim(line, " \r\n"))
}
person Pie 'Oh' Pah    schedule 05.03.2017

Возможно ли, что ваши данные 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)

}
person Colin Stewart    schedule 05.03.2017
comment
Большое спасибо, к сожалению, я могу только проголосовать, так как я принял ответ PieOhPah (кажется, оба ответа правильно решили мою проблему) - person fisker; 05.03.2017