# Day34 Golang 操作CSV档案

Day34 Golang 操作CSV

CVS 是以逗号,及换行\n分隔的资料格式,
从CSV的英文(Comma-Separated Values)中就能窥出一二。

CSV长的怎样

用Excel开启一个CSV档案
(副档名要为.csv 而非.xlsx。 xlsx是 Microsoft Office Excel 独有的格式)
Execl

用记事本开启一个CSV档案
原来就长成这样而已
Notepad++

(也有出现以空白字元\t 或其他字元来做分隔,只要解析时以该字元下去做区隔就行)

读取 Read CSV

Golang读档案时会需要用到绝对路径
在这边先取 pwd 当前路径、再加上 fileName 档案名称。

var Pwd string
var FilePath string
var FileName = "test.csv"

func init() {
	Pwd, _ = os.Getwd()
	FilePath = filepath.Join(Pwd, FileName)
}

func Load() {
	file, err := os.OpenFile(FilePath, os.O_RDONLY, 0777) // os.O_RDONLY 表示只读、0777 表示(owner/group/other)权限
	if err != nil {
		log.Fatalln("找不到CSV档案路径:", FilePath, err)
	}

	// read
	r := csv.NewReader(file)
	r.Comma = ','	// 以何种字元作分隔,预设为`,`。所以这里可拿掉这行
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatalln(err)
		}

		var a = record[0]
		var b = record[1]

		fmt.Println(a, b)
	}
}

读取结果

读取结果

读写权限的常数

os.O_RDONLY 唯读
os.O_WRONLY 唯写
os.O_RDWR   读/写

详见官方文档

写入 Write CSV

Write写入单行

func Write() {
	file, err := os.OpenFile(FilePath, os.O_WRONLY, 0777)
	if err != nil {
		log.Fatalln("找不到CSV档案路径:", FilePath, err)
	}

	w := csv.NewWriter(file)
	x := []string{"999"}
	w.Write(x)

	w.Flush() // 把在buffer缓存中的所有资料输出
}

WriteAll写入多行

	w := csv.NewWriter(file)
	x := [][]string{{"999", "1"}, {"998", "997"}}
	w.WriteAll(x)

	w.Flush() // 把在buffer缓存中的所有资料输出

写入的坑

若开启一个空白档案写入,不会有任何问题。
但若开启已经有资料的CSV,再写入的话会发生炸裂

已有的原始资料
原始资料

如果写入以下一行资料

	w := csv.NewWriter(file)
	x := []string{"999"}
	w.Write(x)

	w.Flush() // 把在buffer缓存中的所有资料输出

咦~~怎麽跟我预想的结果不太一样?!

炸裂过後
炸裂过後

怎麽多了一堆莫名其妙的空格?

用EXCEL开,会看不清发生了什麽事情,
但以记事本开启的话:

资料从原本的状态
原始资料

变成这样
炸裂过後

也就是说,我输入的单行的资料是'999'\n',把原始资料1,2,3,4'\n'给盖过去
将最前面四个字元覆盖掉了,就变成999'\n'3,4'\n' ...

所以用Excel打开才会被解析成上方那样的炸裂图。

附加 Append CSV

打开档案的时候以 O_APPEND 模式开启,
就能不影响旧资料,将欲写入的资料Append在最後了。

	file, err := os.OpenFile(FilePath, os.O_APPEND, 0777)

<<:  # Day33 无内文 待补

>>:  # Day35 Golang - Google Sheet 试算表应用 (Spreadsheet)

[面试]做好自我检核,面试就是上战场!

千万不要在毫无准备的状态下奔赴战场! 面试已经是充满未知数的战场,如果你到了战场才发现自己把装备忘...

[NestJS 带你飞!] DAY19 - Module Reference

前面有提过,注入 Provider 的方式只需要在 constructor 设计参数并附上对应的型别...

成员 19 人:

撰写中 在求发展的道路上,又过了一日...... 这时,成员 19 人。 ...

[Day11] 团队系统设计 - 估点系统 (上)

2020年的 Q4 期间,我对几场面试的印象非常深刻,连续三位来自不同公司,不同领域背景的应徵者,不...

创建App-上传App

创建App-上传App -在上方功能选择栏点击Product然後选择Archive. -在於右边栏目...