非常教程

Go参考手册

编码 | encoding

encoding/csv

  • import "encoding/csv"
  • 概述
  • 索引
  • 示例

概述

Csv 包读取和写入逗号分隔值(CSV) 文件。CSV 文件有很多种,该软件包支持 RFC 4180 中描述的格式。

一个 csv 文件包含每个记录一个或多个字段的零个或多个记录。每条记录由换行符分隔。最后的记录可以选择跟随一个换行符。

field1,field2,field3

白色空间被视为一个域的一部分。

在换行符被无声删除之前,回车返回。

空白行被忽略。只有空白字符的行(不包括结尾换行符)不被视为空白行。

以引号字符开头和结尾的字段称为引用字段。开始和结束引号不是字段的一部分。

来源:

normal string,"quoted-field"

结果在这些领域

{`normal string`, `quoted-field`}

在引用字段中,引号字符后跟第二个引号字符被视为单引号。

"the ""word"" is true","a ""quoted-field"""

结果是

{`the "word" is true`, `a "quoted-field"`}

换行符和逗号可以包含在引用字段中

"Multi-line
field","comma is ,"

结果是

{`Multi-line
field`, `comma is ,`}

索引

  • 变量
  • type ParseError
  • func (e *ParseError) Error() string
  • type Reader
  • func NewReader(r io.Reader) *Reader
  • func (r *Reader) Read() (record []string, err error)
  • func (r *Reader) ReadAll() (records [][]string, err error)
  • type Writer
  • func NewWriter(w io.Writer) *Writer
  • func (w *Writer) Error() error
  • func (w *Writer) Flush()
  • func (w *Writer) Write(record []string) error
  • func (w *Writer) WriteAll(records [][]string) error

示例

Reader Reader.ReadAll Reader(Options) Writer Writer.WriteAll

包文件

reader.go writer.go

变量

这些是可以在 ParseError.Error 中返回的错误

var (
        ErrTrailingComma = errors.New("extra delimiter at end of line") // 不再使用
        ErrBareQuote     = errors.New("bare \" in non-quoted-field")
        ErrQuote         = errors.New("extraneous \" in field")
        ErrFieldCount    = errors.New("wrong number of fields in line")
)

type ParseError(查看源代码)

解析错误返回 ParseError。第一行是1。第一列是0。

type ParseError struct {
        Line   int   // 发生错误的行
        Column int   // 发生错误的列(符文索引)
        Err    error // 实际的错误
}

func (*ParseError) Error(查看源代码)

func (e *ParseError) Error() string

type Reader(查看源代码)

Reader 从 CSV 编码的文件中读取记录。

正如 NewReader 返回的那样,Reader 期望符合 RFC 4180 的输入。可以在第一次调用 Read 或 ReadAll 之前更改导出的字段以定制细节。

type Reader struct {
        // 逗号是字段分隔符。
        // 它由NewReader设置为逗号(',')。
        Comma rune
        // 注释(如果不是0)是注释字符。 以...开头的行
        // 不带前置空格的注释字符将被忽略。
        // 使用前导空格,Comment字符成为其中的一部分
        // 字段,即使TrimLeadingSpace为true。
        Comment rune
        // FieldsPerRecord是每条记录的预期字段数。
        // 如果FieldsPerRecord为正数,则Read需要每条记录
        // 拥有给定数量的字段。 如果FieldsPerRecord为0,则Read将其设置为
        // 第一条记录中的字段数,以便将来的记录必须
        // 具有相同的字段数。 如果FieldsPerRecord为负数,则不进行检查
        // 制作和记录可能有可变数量的字段。
        FieldsPerRecord int
        // 如果LazyQuotes为true,则引号可能出现在不带引号的字段和
        // 非加倍引号可能出现在引用字段中。
        LazyQuotes    bool
        TrailingComma bool // 忽略; 这里是为了向后兼容
        // 如果TrimLeadingSpace为true,则忽略字段中的前导空格。
        // 即使字段分隔符(逗号)是空白区域,也会执行此操作。
        TrimLeadingSpace bool
        // ReuseRecord控制对Read的调用是否可以返回切片共享
        // 前一个调用的返回切片的后备数组以提高性能。
        // 默认情况下,每次调用Read都会返回调用者拥有的新分配的内存。
        ReuseRecord bool
        // 包含已过滤或未导出的字段
}

示例

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"strings"
)

func main() {
	in := `first_name,last_name,username
"Rob","Pike",rob
Ken,Thompson,ken
"Robert","Griesemer","gri"
`
	r := csv.NewReader(strings.NewReader(in))

	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}

		fmt.Println(record)
	}
}

示例(Options)

此示例显示如何配置 csv.Reader 以处理其他类型的 CSV 文件。

package main

import (
	"encoding/csv"
	"fmt"
	"log"
	"strings"
)

func main() {
	in := `first_name;last_name;username
"Rob";"Pike";rob
# lines beginning with a # character are ignored
Ken;Thompson;ken
"Robert";"Griesemer";"gri"
`
	r := csv.NewReader(strings.NewReader(in))
	r.Comma = ';'
	r.Comment = '#'

	records, err := r.ReadAll()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Print(records)
}

func NewReader(查看源代码)

func NewReader(r io.Reader) *Reader

NewReader 返回一个新的从 r 读取的 Reader。

func (*Reader) Read(查看源代码)

func (r *Reader) Read() (record []string, err error)

读取从r读取一个记录(一段字段)。如果记录具有意外数量的字段,则 Read 将返回记录以及错误 ErrFieldCount。除此之外,Read 总是返回一个非零记录或一个非零错误,但不是两者都有。如果没有数据需要读取,则读取返回 nil,io.EOF。如果 ReuseRecord 为 true,则可以在多次调用 Read 之间共享返回的切片。

func (*Reader) ReadAll(查看源代码)

func (r *Reader) ReadAll() (records [][]string, err error)

ReadAll 从 r 读取所有剩余的记录。每条记录都是一片田地。成功的调用返回 err == nil,而不是 err == io.EOF。由于 ReadAll 被定义为读取直到 EOF,因此它不会将文件末尾视为要报告的错误。

示例

package main

import (
	"encoding/csv"
	"fmt"
	"log"
	"strings"
)

func main() {
	in := `first_name,last_name,username
"Rob","Pike",rob
Ken,Thompson,ken
"Robert","Griesemer","gri"
`
	r := csv.NewReader(strings.NewReader(in))

	records, err := r.ReadAll()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Print(records)
}

type Writer(查看源代码)

Writer 将记录写入 CSV 编码文件。

如 NewWriter 返回的,Writer 写入由换行符终止的记录,并使用 ',' 作为字段分隔符。在首次调用 Write 或 WriteAll 之前,可以更改导出的字段以定制细节。

逗号是字段分隔符。

如果 UseCRLF 为 true,则 Writer 以 \r\n 结束每个记录而不是 \n。

type Writer struct {
        Comma   rune // 字段分隔符(由NewWriter设置为','
        UseCRLF bool // 如果使用 \r\n 作为行终止符,则为True
        // 包含已过滤或未导出的字段
}

示例

package main

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

func main() {
	records := [][]string{
		{"first_name", "last_name", "username"},
		{"Rob", "Pike", "rob"},
		{"Ken", "Thompson", "ken"},
		{"Robert", "Griesemer", "gri"},
	}

	w := csv.NewWriter(os.Stdout)

	for _, record := range records {
		if err := w.Write(record); err != nil {
			log.Fatalln("error writing record to csv:", err)
		}
	}

	// Write any buffered data to the underlying writer (standard output).
	w.Flush()

	if err := w.Error(); err != nil {
		log.Fatal(err)
	}
}

func NewWriter(查看源代码)

func NewWriter(w io.Writer) *Writer

NewWriter 返回一个写入 w 的新 Writer。

func (*Writer) Error(查看源代码)

func (w *Writer) Error() error

错误报告在先前写入或刷新期间发生的任何错误。

func (*Writer) Flush(查看源代码)

func (w *Writer) Flush()

Flush 将任何缓冲的数据写入底层的 io.Writer。要检查在刷新过程中是否发生错误,请调用错误。

func (*Writer) Write(查看源代码)

func (w *Writer) Write(record []string) error

Writer 写一个 CSV 记录以及任何必要的报价。记录是一串字符串,每个字符串都是一个字段。

func (*Writer) WriteAll(查看源代码)

func (w *Writer) WriteAll(records [][]string) error

WriteAll 使用 Write 写入多个 CSV 记录,然后调用 Flush。

示例

package main

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

func main() {
	records := [][]string{
		{"first_name", "last_name", "username"},
		{"Rob", "Pike", "rob"},
		{"Ken", "Thompson", "ken"},
		{"Robert", "Griesemer", "gri"},
	}

	w := csv.NewWriter(os.Stdout)
	w.WriteAll(records) // calls Flush internally

	if err := w.Error(); err != nil {
		log.Fatalln("error writing csv:", err)
	}
}
Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串