CVS 是以逗号,
及换行\n
分隔的资料格式,
从CSV的英文(Comma-Separated Values)中就能窥出一二。
用Excel开启一个CSV档案
(副档名要为.csv 而非.xlsx。 xlsx是 Microsoft Office Excel 独有的格式)
用记事本开启一个CSV档案
原来就长成这样而已
(也有出现以空白字元、
\t
或其他字元来做分隔,只要解析时以该字元下去做区隔就行)
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写入单行
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打开才会被解析成上方那样的炸裂图。
打开档案的时候以 O_APPEND
模式开启,
就能不影响旧资料,将欲写入的资料Append在最後了。
file, err := os.OpenFile(FilePath, os.O_APPEND, 0777)
>>: # Day35 Golang - Google Sheet 试算表应用 (Spreadsheet)
千万不要在毫无准备的状态下奔赴战场! 面试已经是充满未知数的战场,如果你到了战场才发现自己把装备忘...
前面有提过,注入 Provider 的方式只需要在 constructor 设计参数并附上对应的型别...
撰写中 在求发展的道路上,又过了一日...... 这时,成员 19 人。 ...
2020年的 Q4 期间,我对几场面试的印象非常深刻,连续三位来自不同公司,不同领域背景的应徵者,不...
创建App-上传App -在上方功能选择栏点击Product然後选择Archive. -在於右边栏目...