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