GO语言删除文本文件中的指定行
1. 思路
假设现在有一个文本文件,我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件,遍历整个文件然后将除过乱码的行写入一个新文件,以此来实现我们的需求。
2. 处理文件
假设我们现在有一个配置文件hello.conf,用户经常修改导致文件错乱或出现乱码情况,我们需要去除乱码行以保证配置文件可用。
如下一个示例文件,注释使用#加文本,配置信息使用等号分隔,我们需要去除掉文件中的空行、乱码行、不包含=和#的行和包含#号却不在开头的行。
#系统版本
version=v1.0.0
#系统平台
platform=arm
#数据库信息
database=127.0.0.1;3306;123456;mysql
@1234
#https端口
httpsport=8443
8443#dd
#用于开启https的设置
enablehttps=false
#插入数据库是否携带服务名称
is.add.name=false
#设备型号
model=RTD-1
首先以可读写的方式打开文件,并使用换行符来遍历文件。通过特定条件筛选出可用行,并将其写入新文件中,最后修改新创建的文件,完成处理。
package
import (
"bufio"
"io"
"log"
"os"
"strings"
)
const (
FILE = "hello.conf"
NEWFILE = "hellonew.conf"
)
func main() {
deleteBadLine()
}
func deleteBadLine() {
//以可读写方式打开文件
file, err := os.OpenFile(FILE, os.O_RDWR, 0666)
if err != nil {
log.Fatal(err)
}
defer file.Close()
//创建一个文件并以可读写方式打开
destFile, err := os.OpenFile(NEWFILE, os.O_CREATE | os.O_RDWR, 0666)
if err != nil {
log.Fatal(err)
}
defer destFile.Close()
//将文件内容写入缓冲区中
reader := bufio.NewReader(file)
for {
//以换行符来遍历文件
line, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
//读到文件结尾
if err == io.EOF {
break
}
//根据特定条件筛选行
if len(line) == 0 || line == "\r\n" || !strings.Contains(line, "=") && !strings.Contains(line, "#") || strings.Contains(line, "#") && !strings.HasPrefix(line, "#") {
log.Println("Bad line:", line)
continue
} else {
log.Println("Normal line:", line)
//将可用的行写入新文件
if _, err = destFile.WriteString(line); err != nil {
log.Fatal(err)
}
}
}
//处理完毕,将新创建的文件重命名
//linux系统可以通过重命名来覆盖静态文件,若其他系统,则需要先进行删除或备份,再重命名
os.Rename(NEWFILE, FILE)
}
3. 处理后的文本文件
#系统版本
version=v1.0.0
#系统平台
platform=arm
#数据库信息
database=127.0.0.1;3306;123456;mysql
#https端口
httpsport=8443
#用于开启https的设置
enablehttps=false
#插入数据库是否携带服务名称
is.add.name=false
#设备型号
model=RTD-1