shell 如何从文件中读取字串_Golang处理MySQL字符集编码-Step3读取文件

我们按照之前的工作流程,还是先创建目录step-3

创建main.go

编写一个简单的main方法。

1. 打开Shell窗口,创建目录

$ mkdir step-3
$ cd step-3

2. 创建main.go

$ touch main.go 

3. 使用熟悉的编辑器复制如下内容到main.go

package main

import ("fmt")
func main(){
	fmt.Println("just a main func")
}

回到Shell窗口,执行如下命令

$ go mod init 
$ go mod tidy
$ go run main.go

f20c4f87a511337c65b5021328428584.png

过滤器

定义一个过滤器类型,本项目中,我们没使用这个过滤器,仅作为示例。

//ReadLinesFilter 文本行过滤器
type ReadLinesFilter func(btline []byte) bool

ReadLines

编写读取文本行的方法,两个参数分别是文件名和过滤器。

//ReadLines 从文件中读取文本行列表
//
//	支持错误处理
//	支持自定义文本行过滤器
func ReadLines(path string, filter ReadLinesFilter) (lines []string, err error) {
	var (
		file   *os.File
		part   []byte
		prefix bool
	)
	if file, err = os.Open(path); err != nil {
		return
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	//@todo:
	buffer := bytes.NewBuffer(make([]byte, 0))
	for {
		if part, prefix, err = reader.ReadLine(); err != nil {
			break
		}
		buffer.Write(part)
		if !prefix {
			if filter != nil {
				if filter(buffer.Bytes()) {
					lines = append(lines, buffer.String())
				}
			} else {
				lines = append(lines, buffer.String())
			}
			buffer.Reset()
		}
	}
	if err == io.EOF {
		err = nil
	}
	return
}

源代码

package main


import (
	"bufio"
	"bytes"
	"fmt"

	"io"
	"os"
)

func main() {
	
	srcCheckLines, _ := ReadLines("./src_checkLines.txt", nil)
	for _, checkLine := range srcCheckLines {
		fmt.Println(checkLine)
	}
	
}

//ReadLinesFilter 文本行过滤器
type ReadLinesFilter func(btline []byte) bool

//ReadLines 从文件中读取文本行列表
//
//	支持错误处理
//	支持自定义文本行过滤器
func ReadLines(path string, filter ReadLinesFilter) (lines []string, err error) {
	var (
		file   *os.File
		part   []byte
		prefix bool
	)
	if file, err = os.Open(path); err != nil {
		return
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	//@todo:
	buffer := bytes.NewBuffer(make([]byte, 0))
	for {
		if part, prefix, err = reader.ReadLine(); err != nil {
			break
		}
		buffer.Write(part)
		if !prefix {
			if filter != nil {
				if filter(buffer.Bytes()) {
					lines = append(lines, buffer.String())
				}
			} else {
				lines = append(lines, buffer.String())
			}
			buffer.Reset()
		}
	}
	if err == io.EOF {
		err = nil
	}
	return
}

运行结果

回到Shell窗口

执行如下命令

$ go run main.go

0601781f420c10658f066bb691f553bf.png

注意这里因为我们Terminal编码设置为GBK,所以正常输出了汉字。

macOS下Terminal缺省UTF8编码,则输出乱码。

5adbb43f9b77c29a1a0f5d0be3081826.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值