Golang 去除字符串后缀后按原换行格式写入文件问题求解
问题原因
你的代码存在两个核心问题导致结果不符合预期:
- 用
strings.Split(string(a), "\n")按换行拆分字符串后,得到的每个切片元素都不带换行符,你直接写入处理后的内容时没有补加换行,最终所有内容会拼接成一整行。 - 如果你的源文件是Windows格式(行尾为
\r\n),按\n拆分后每行末尾会残留\r字符,导致strings.TrimSuffix(i, "L3")无法匹配到末尾的L3,后缀去除逻辑失效。
修复方案
- 改用
strings.SplitLines()方法拆分文件内容,该方法会自动适配不同操作系统的换行格式,拆分结果不会残留多余控制字符,能保证后缀去除逻辑正常运行。 - 每行处理完成后写入时,手动补加换行符
\n即可保持原有换行格式。 - 你已经通过
defer f.Close()声明了文件自动关闭,末尾重复调用f.Close()属于冗余代码可以删除。
修复后代码
package main import ( "fmt" "io/ioutil" "os" "strings" ) func main() { // 读取源文件 n, err := ioutil.ReadFile("box_1") if err != nil { fmt.Println(err) return } a := string(n) // 按行拆分内容,自动适配不同系统换行格式 sliceData := strings.SplitLines(a) // 创建目标文件 f, err := os.Create("box_2") if err != nil { fmt.Println(err) return } defer f.Close() for _, line := range sliceData { // 跳过空行,避免写入多余空行 if line == "" { continue } trimmedLine := strings.TrimSuffix(line, "L3") fmt.Println(trimmedLine) // 写入处理后的内容 + 换行符 _, err = f.WriteString(trimmedLine + "\n") if err != nil { fmt.Println("写入文件失败:", err) return } } }
如果需要生成Windows格式的换行,将trimmedLine + "\n"改为trimmedLine + "\r\n"即可。
内容的提问来源于stack exchange,提问作者elzwhere
相关产品推荐
相关产品推荐

