使用Go语言标准库对CSV文件进行读写

使用Go标准卡的encoding/csv 包对CSV文件的读取和写入是非常简单。今天我们就来学习下怎么使用它

首先假设我们有一个foo.csv的csv文件:

| ID  | Name | Email            | Revenue  |
|-----|------|------------------|----------|
| 123 | John | [email protected] | $141,987 |
|-----|------|------------------|----------|
| 456 | Sam  | [email protected]  | $905,234 |

我们可以打开文件并且创建一个csv.Reader对象

csvFile, err := os.Open("./foo.csv")
if err != nil {
  panic(err)
}
defer csvFile.Close()

csvReader := csv.NewReader(csvFile)

我们看下csv.NewReader()的源码:

func NewReader(r io.Reader) *Reader

csv.NewReader可以接受io.Reader的interface所以我们还可以使用下面方式读取csv文件:

读取单行数据

我们可以使用csv.Reader.Read来读取一行的数据

row, err := csvReader.Read()

上面代码会返回一个slice和错误信息,当文件结束的时候回返回io.EOF错误。

比如我们的第一行数据是[]string{“ID”, “Name”, “Email”, “Revenue”}那么

n := row[1] // n == "Name"

我们可以使用For 循环将csv文件中的一行数据读取出来:

for {
  row, err := csvReader.Read()
  if err == io.EOF {
    break
  } else if err != nil {
    panic(err) // or handle it another way
  }
  // use the `row` here
}

读取剩下的行

我们之前使用了csv.Reader读取了csv文件的一行数据,那么剩下的数据我们可以csv.ReadAll 读取剩下的数据:

rows, err := csvReader.ReadAll() // `rows` is of type [][]string
if err != nil {
  panic(err)
}
for i, row := range rows {
  // process the `row` here
}

写入数据到CSV文件

如果我们想把数据写入到csv文件中那么我们需要使用os.Create ,如果这个文件已经存在那么我们就会重新覆盖这个文件:

csvFile, err := os.Create("./bar.csv")
if err != nil {
  panic(err)
}
defer csvFile.Close()

csvWriter := csv.NewWriter(csvFile)

我们之前提到过可以读单行数据,相反我们也可以使用csv.Writer.Write写单行数据:

err := csvWriter.Write([]string{"678", "Jane", "[email protected]", "$548,980"})

其实上面的代码并不会将我们的数据写入文件中,我们还需要调用csv.Writer.Flush才能将数据写入文件中。

csvWriter.Flush()
err := csvWriter.Error()
if err != nil {
  // an error occurred during the flush
}

多行写入:

我们可以使用csv.Writer.WriteAll  将数据写入到文件中,当然也不要忘了csvWriter.Flush()  :

rows := [][]string{
  { "123", "John", "[email protected]", "$141,987"},
  { "456", "Sam", "[email protected]", "$905,234"},
  { "678", "Jane", "[email protected]", "$548,980"},
}
err := csvWriter.WriteAll(rows)

我们看看完整的写入Demo:

package main

import (
  "encoding/csv"
  "fmt"
  "os"
)

func main() {
  csvFile, err := os.Create("./bar.csv")
  if err != nil {
    panic(err)
  }
  defer csvFile.Close()

  csvWriter := csv.NewWriter(csvFile)
  rows := [][]string{
    {"123", "John", "[email protected]", "$141,987"},
    {"456", "Sam", "[email protected]", "$905,234"},
    {"678", "Jane", "[email protected]", "$548,980"},
  }
  err = csvWriter.WriteAll(rows)
  if err != nil {
    fmt.Printf("error (%v)", err)
    return
  }
}

执行之后的效果:

done!😀

打赏作者

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Leave a Reply

Your email address will not be published. Required fields are marked *