英文:
Why does "fmt.Sprintf("%v,", lines[i])" put the comma on new line?
问题
这是完整的代码:
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 文件,例如:
第一行:{ "foo":"bar","baz":null }
第二行:{ "foo":"bar","baz":"quz" }
我想在所有行的末尾添加逗号。任何帮助将不胜感激。
只是为了让自己更清楚一些,我现在得到的结果是:
{ "foo":"bar","baz":null },
{ "foo":"bar","baz":"quz" },
而我想要得到的结果是:
{ "foo":"bar","baz":null },
{ "foo":"bar","baz":"quz" },
英文:
This is the full code:
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 assume it is because lines[i] must contain a newline byte at the end of the string.. I have tried to remove it but failed..
The files I load are just json files e.g.
line 1: { "foo":"bar","baz":null }
line 2: { "foo":"bar","baz":"quz" }
Where I am trying to add a comma to the end of all lines.. any help would be much appreciated
Just to make myself a little more clear, what I get now is:
{ "foo":"bar","baz":null }
,
{ "foo":"bar","baz":"quz" }
,
whereas what I want to get is:
{ "foo":"bar","baz":null },
{ "foo":"bar","baz":"quz" },
答案1
得分: 3
你的 JSON 数据是否来自 Windows 平台,并且实际上包含了 /r/n 而不仅仅是 /n?你可以在这个 playground 示例 中看到这种行为:
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)
}
英文:
Is it possible that your JSON data is coming from Windows and actually contains /r/n rather than just /n?
You can see this behaviour using /r/n in this playground example:
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)
}
答案2
得分: 3
尝试修剪该行,以清除其末尾的Unicode代码点:
import "strings"
// ...
for _, line := range lines {
line = fmt.Sprintf("%v,", strings.Trim(line, " \r\n"))
}
英文:
Try trimming the line to clean up whatever trailing unicode code points it has:
import "strings"
// ...
for _, line := range lines {
line = fmt.Sprintf("%v,", strings.Trim(line, " \r\n"))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论