golang按换行符一行一行读取GBK文件,写入GBK格式文件

package main

import (
	"bufio"
	"fmt"
	"github.com/axgle/mahonia"
	"io"
	"log"
	"os"
)

func main() {
	filename := "/tmp/test.txt"
	readTbkByLine(filename)
}

// 本方法安全可用
func readTbkByLine(filename string) {
	FileHandle, err := os.Open(filename)
	if err != nil {
		log.Println(err)
		return
	}
	defer FileHandle.Close()
	// 指定gbk解码
	decoder := mahonia.NewDecoder("gbk")
	buf := bufio.NewReader(decoder.NewReader(FileHandle))
	for {
		// ReadBytes 方法安全可用,以换行符作为读取文件的截止符,经过多次测试GBK文件没有乱码
		line, e := buf.ReadBytes('\n')
		if e != nil {
			panic(e)
		}
		// 结束
		if e == io.EOF {
			break
		}
		fmt.Println(string(line))
	}
}

// readGbk 本方法仅仅做对照,因为ReadLine方法在有些测试文件有问题
func readGbk(filename string) {
	f, err := os.Open(filename)
	if err != nil {
		fmt.Println("文件不存在:", filename)
		return
	}
	decoder := mahonia.NewDecoder("gbk") // 把原来ANSI格式的文本文件里的字符,用gbk进行解码。
	buf := bufio.NewReader(decoder.NewReader(f))
	for {
		// 按照ReadLine读取行有些测试的GBK文件文件
		l, _, e := buf.ReadLine()
		if e == io.EOF {
			break
		}
		fmt.Println(string(l))
	}
}

// 覆盖写入GBK
func writeGbkFile(filename string) {
	file, err := os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	enc := mahonia.NewEncoder("gbk")
	writer.WriteString(enc.ConvertString("这是测试的第一行" + "\n"))
	writer.WriteString(enc.ConvertString("这是测试的第二行" + "\n"))
	writer.WriteString(enc.ConvertString("这是测试的第三行" + "\n"))
	writer.Flush()
}

posted @ 2023-12-10 22:29  熊先生不开玩笑  阅读(245)  评论(0)    收藏  举报