go语言入门(9)文本文件处理
1,字符串处理
字符串在开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,我们可以通过Go标准库中的strings和strconv两个包中的函数进行相应的操作。
1.1字符串操作
下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。
1) Contains
func Contains(s, substr string) bool
功能:字符串s中是否包含substr,返回bool值
示例代码:
fmt.Println(strings.Contains("seafood", "foo"))
fmt.Println(strings.Contains("seafood", "bar"))
fmt.Println(strings.Contains("seafood", ""))
fmt.Println(strings.Contains("", ""))
//运行结果:
//true
//false
//true
//true
2)Join
func Join(a []string, sep string) string
功能:字符串链接,把slice a通过sep链接起来
示例代码:
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))
//运行结果:foo, bar, baz
3)Index
func Index(s, sep string) int
功能:在字符串s中查找sep所在的位置,返回位置值,找不到返回-
示例代码:
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
//运行结果:
// 4
// -1
4)Repeat
func Repeat(s string, count int) string
功能:重复s字符串count次,最后返回重复的字符串
示例代码:
fmt.Println("ba" + strings.Repeat("na", ))
//运行结果:banana
5)Replace
func Replace(s, old, new string, n int) string
功能:在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换
示例代码:
fmt.Println(strings.Replace("oink oink oink", "k", "ky", ))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -))
//运行结果:
//oinky oinky oink
//moo moo moo
6)Split
func Split(s, sep string) []string
功能:把s字符串按照sep分割,返回slice
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))
//运行结果:
//["a" "b" "c"]
//["" "man " "plan " "canal panama"]
//[" " "x" "y" "z" " "]
//[""]
7)Trim
func Trim(s string, cutset string) string
功能:在s字符串的头部和尾部去除cutset指定的字符串
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
//运行结果:["Achtung"]
8)Fields
func Fields(s string) []string
功能:去除s字符串的空格符,并且按照空格分割返回slice
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz "))
//运行结果:Fields are: ["foo" "bar" "baz"]
1.2,字符串转换
字符串转化的函数在strconv中,如下也只是列出一些常用的。
1)Append
Append 系列函数将整数等转换为字符串后,添加到现有的字节数组中
str := make([]byte, , )
str = strconv.AppendInt(str, , ) //以10进制方式追加
str = strconv.AppendBool(str, false)
str = strconv.AppendQuote(str, "abcdefg")
str = strconv.AppendQuoteRune(str, '单') fmt.Println(string(str)) //4567false"abcdefg"'单'
2)Format
Format 系列函数把其他类型的转换为字符串。
a := strconv.FormatBool(false)
b := strconv.FormatInt(, )
c := strconv.FormatUint(, )
d := strconv.Itoa() fmt.Println(a, b, c, d) //false 1234 12345 1023
3)Parse
Parse 系列函数把字符串转换为其他类型。
package main import (
"fmt"
"strconv"
) func checkError(e error) {
if e != nil {
fmt.Println(e)
}
}
func main() {
a, err := strconv.ParseBool("false")
checkError(err)
b, err := strconv.ParseFloat("123.23", )
checkError(err)
c, err := strconv.ParseInt("", , )
checkError(err)
d, err := strconv.ParseUint("", , )
checkError(err)
e, err := strconv.Atoi("")
checkError(err)
fmt.Println(a, b, c, d, e) //false 123.23 1234 12345 1023
}
2,正则表达式
正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。
详细的语法描述参考:http://code.google.com/p/re2/wiki/Syntax
如果strings包能解决你的问题,那么就尽量使用它来解决。因为他们足够简单、而且性能和可读性都会比正则好。
package main import (
"fmt"
"regexp"
) func main() {
context1 := "3.14 123123 .68 haha 1.0 abc 6.66 123." //MustCompile解析并返回一个正则表达式。如果成功返回,该Regexp就可用于匹配文本。
//解析失败时会产生panic
// \d 匹配数字[0-9],d+ 重复>=1次匹配d,越多越好(优先重复匹配d)
exp1 := regexp.MustCompile(`\d+\.\d+`) //返回保管正则表达式所有不重叠的匹配结果的[]string切片。如果没有匹配到,会返回nil。
//result1 := exp1.FindAllString(context1, -1) //[3.14 1.0 6.66]
result1 := exp1.FindAllStringSubmatch(context1, -) //[[3.14] [1.0] [6.66]] fmt.Printf("%v\n", result1)
fmt.Printf("\n------------------------------------\n\n") context2 := `
<title>标题</title>
<div>你过来啊</div>
<div>hello mike</div>
<div>你大爷</div>
<body>呵呵</body>
`
//(.*?)被括起来的表达式作为分组
//匹配<div>xxx</div>模式的所有子串
exp2 := regexp.MustCompile(`<div>(.*?)</div>`)
result2 := exp2.FindAllStringSubmatch(context2, -) //[[<div>你过来啊</div> 你过来啊] [<div>hello mike</div> hello mike] [<div>你大爷</div> 你大爷]]
fmt.Printf("%v\n", result2)
fmt.Printf("\n------------------------------------\n\n") context3 := `
<title>标题</title>
<div>你过来啊</div>
<div>hello
mike
go</div>
<div>你大爷</div>
<body>呵呵</body>
`
exp3 := regexp.MustCompile(`<div>(.*?)</div>`)
result3 := exp3.FindAllStringSubmatch(context3, -) //[[<div>你过来啊</div> 你过来啊] [<div>你大爷</div> 你大爷]]
fmt.Printf("%v\n", result3)
fmt.Printf("\n------------------------------------\n\n") context4 := `
<title>标题</title>
<div>你过来啊</div>
<div>hello
mike
go</div>
<div>你大爷</div>
<body>呵呵</body>
`
exp4 := regexp.MustCompile(`<div>(?s:(.*?))</div>`)
result4 := exp4.FindAllStringSubmatch(context4, -) /*
[[<div>你过来啊</div> 你过来啊] [<div>hello
mike
go</div> hello
mike
go] [<div>你大爷</div> 你大爷]]
*/
fmt.Printf("%v\n", result4)
fmt.Printf("\n------------------------------------\n\n") for _, text := range result4 {
fmt.Println(text[]) //带有div
fmt.Println(text[]) //不带带有div
fmt.Println("================\n")
}
}
3,JSON处理
4,文件操作
4.1相关api
1)建立与打开文件
新建文件可以通过如下两个方法:
func Create(name string) (file *File, err Error)
根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666的文件,返回的文件对象是可读写的。 func NewFile(fd uintptr, name string) *File
根据文件描述符创建相应的文件,返回一个文件对象
通过如下两个方法来打开文件:
func Open(name string) (file *File, err Error)
该方法打开一个名称为name的文件,但是是只读方式,内部实现其实调用了OpenFile。 func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限
2)写文件
func (file *File) Write(b []byte) (n int, err Error)
写入byte类型的信息到文件 func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
在指定位置开始写入byte类型的信息 func (file *File) WriteString(s string) (ret int, err Error)
写入string信息到文件
3)读文件
func (file *File) Read(b []byte) (n int, err Error)
读取数据到b中 func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
从off开始读取数据到b中
4)删除文件
func Remove(name string) Error
调用该函数就可以删除文件名为name的文件
4.2,示例
1)写文件
package main import (
"fmt"
"os"
) func main() {
fout, err := os.Create("./xxx.txt") //新建文件
//fout, err := os.OpenFile("./xxx.txt", os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
} defer fout.Close() //main函数结束前, 关闭文件 for i := ; i < ; i++ {
outstr := fmt.Sprintf("%s:%d\n", "Hello go", i)
fout.WriteString(outstr) //写入string信息到文件
fout.Write([]byte("abcd\n")) //写入byte类型的信息到文件
}
}
2)读文件
func main() {
fin, err := os.Open("./xxx.txt") //打开文件
if err != nil {
fmt.Println(err)
}
defer fin.Close() buf := make([]byte, ) //开辟1024个字节的slice作为缓冲
for {
n, _ := fin.Read(buf) //读文件
if n == { //0表示已经到文件结束
break
} fmt.Println(string(buf)) //输出读取的内容
}
}
3)拷贝文件
package main import (
"fmt"
"io"
"os"
) func main() {
args := os.Args //获取用户输入的所有参数 //如果用户没有输入,或参数个数不够,则调用该函数提示用户
if args == nil || len(args) != {
fmt.Println("useage : xxx srcFile dstFile")
return
} srcPath := args[] //获取输入的第一个参数
dstPath := args[] //获取输入的第二个参数
fmt.Printf("srcPath = %s, dstPath = %s\n", srcPath, dstPath) if srcPath == dstPath {
fmt.Println("源文件和目的文件名字不能相同")
return
} srcFile, err1 := os.Open(srcPath) //打开源文件
if err1 != nil {
fmt.Println(err1)
return
} dstFile, err2 := os.Create(dstPath) //创建目的文件
if err2 != nil {
fmt.Println(err2)
return
} buf := make([]byte, ) //切片缓冲区
for {
//从源文件读取内容,n为读取文件内容的长度
n, err := srcFile.Read(buf)
if err != nil && err != io.EOF {
fmt.Println(err)
break
} if n == {
fmt.Println("文件处理完毕")
break
} //切片截取
tmp := buf[:n]
//把读取的内容写入到目的文件
dstFile.Write(tmp)
} //关闭文件
srcFile.Close()
dstFile.Close()
}
go语言入门(9)文本文件处理的更多相关文章
- c语言入门经典(第5版)
文章转载:http://mrcaoyc.blog.163.com/blog/static/23939201520159135915734 文件大小:126MB 文件格式:PDF [点击下载] C ...
- C语言学习书籍推荐《C语言入门经典(第5版)》下载
霍尔顿 (Ivor Horton) (作者), 杨浩 (译者) 下载地址:点我 C语言是每一位程序员都应该掌握的基础语言.C语言是微软.NET编程中使用的C#语言的基础:C语言是iPhone.iPad ...
- C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!
今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- 我为什么反对推荐新人编程C/C++语言入门?
虽然我接触编程以及计算机时间比较早,但是正式打算转入程序员这个行当差不多是大学第四年的事情 从03年接触计算机,07年开始接触计算机编程, 期间接触过的技术包括 缓冲区溢出(看高手写的shellcod ...
- 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书
<C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...
- c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...
- 【转】c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...
- Swift语言入门之旅
Swift语言入门之旅 学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
随机推荐
- Linux 远程登陆图形界面
如果我的解决方案帮助到了你,请随手点亮一颗小红心.如有疑问,可在下方评论区处留言. 利用Xmanager,linux启用XDMCP协议(可直接修改配置文件,也可以采用在Xshell中运行gdmconf ...
- PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
- pyenv激活虚拟环境失败
在使用 pyenv 版本管理工具时激活虚拟环境报错 $ pyenv virtualenvs #列出当前虚拟环境 $ pyenv activate env-3.6.0 #激活虚拟环境 报错信息: Fa ...
- Reveal v4(8796) 使用
文件下载地址 http://xclient.info/s/reveal.html dmg安装成功后, pod install 植入项目. pod 'Reveal-SDK', '~> 4', ...
- flask上下管理文相关 - RequestContetxt & AppContext对象
RequestContetxt / AppContext对象 1.flask程序启动时 当flask程序启动时,通过源码可知,首先会创建两个LocalStack对象,二者内部会分别创建Local对象( ...
- Stream API的代码示例.md
一.代码实例: package com.TestMain; import com.alibaba.fastjson.JSON; import java.util.*; import java.util ...
- JavaScript里的类和继承(转)
转自: http://www.h5cn.com/js/jishu/2016/0121/17634.html js与大部分客户端语言有几点明显的不同: JS是 动态解释性语言,没有编译过程,它在程序运行 ...
- ssh速度慢
原因:DNS解析默认开了 解决方法: vi /etc/ssh/sshd_config, 将#UseDNS yes 改为 : UseDNS no 然后重启ssh服务即可. PS: 其实不好,因为毕竟 ...
- centos7:ssh免密登陆设置及常见错误
目录 一.免密登录设置 二.常见错误 三.CentOS7再ssh-copy-id时的错误 一.免密登录设置 1.使用root用户登录,进入到目录/root/.ssh 2.执行命令:ssh-keygen ...
- JavaSE基础(八)--Java 循环结构
Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...