# package csv
`import "encoding/csv"`
csv讀寫逗號分隔值(csv)的文件。
一個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 ,`}
```
## Index
* [Variables](#pkg-variables)
* [type ParseError](#ParseError)
* [func (e \*ParseError) Error() string](#ParseError.Error)
* [type Reader](#Reader)
* [func NewReader(r io.Reader) \*Reader](#NewReader)
* [func (r \*Reader) Read() (record []string, err error)](#Reader.Read)
* [func (r \*Reader) ReadAll() (records [][]string, err error)](#Reader.ReadAll)
* [type Writer](#Writer)
* [func NewWriter(w io.Writer) \*Writer](#NewWriter)
* [func (w \*Writer) Write(record []string) (err error)](#Writer.Write)
* [func (w \*Writer) WriteAll(records [][]string) (err error)](#Writer.WriteAll)
* [func (w \*Writer) Flush()](#Writer.Flush)
* [func (w \*Writer) Error() error](#Writer.Error)
## Variables
```
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")
)
```
這些都是PaserError.Err字段可能的值。
## type [ParseError](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L63 "View Source")
```
type ParseError struct {
Line int // 出錯的行號
Column int // 出錯的列號
Err error // 具體的錯誤
}
```
當解析錯誤時返回ParseError,第一個行為1,第一列為0。
### func (\*ParseError) [Error](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L69 "View Source")
```
func (e *ParseError) Error() string
```
## type [Reader](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L102 "View Source")
```
type Reader struct {
Comma rune // 字段分隔符(NewReader將之設為',')
Comment rune // 一行開始位置的注釋標識符
FieldsPerRecord int // 每條記錄期望的字段數
LazyQuotes bool // 允許懶引號
TrailingComma bool // 忽略,出于后端兼容性而保留
TrimLeadingSpace bool // 去除前導的空白
// 內含隱藏或非導出字段
}
```
Reader從csv編碼的文件中讀取記錄。
NewReader返回的*Reader期望輸入符合[RFC 4180](http://tools.ietf.org/html/rfc4180)。在首次調用Read或者ReadAll之前可以設定導出字段的細節。
Comma是字段分隔符,默認為','。Comment如果不是0,則表示注釋標識符,以Comment開始的行會被忽略。如果FieldsPerRecord大于0,Read方法要求每條記錄都有給定數目的字段。如果FieldsPerRecord等于0,Read方法會將其設為第一條記錄的字段數,因此其余的記錄必須有同樣數目的字段。如果FieldsPerRecord小于0,不會檢查字段數,允許記錄有不同數量的字段。如果LazyQuotes為真,引號可以出現在非受引字段里,不連續兩個的引號可以出現在受引字段里。如果TrimLeadingSpace為真,字段前導的空白會忽略掉。
### func [NewReader](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L116 "View Source")
```
func NewReader(r io.Reader) *Reader
```
NewReader函數返回一個從r讀取的*Reader。
### func (\*Reader) [Read](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L134 "View Source")
```
func (r *Reader) Read() (record []string, err error)
```
Read從r讀取一條記錄,返回值record是字符串的切片,每個字符串代表一個字段。
### func (\*Reader) [ReadAll](https://github.com/golang/go/blob/master/src/encoding/csv/reader.go#L161 "View Source")
```
func (r *Reader) ReadAll() (records [][]string, err error)
```
ReadAll從r中讀取所有剩余的記錄,每個記錄都是字段的切片,成功的調用返回值err為nil而不是EOF。因為ReadAll方法定義為讀取直到文件結尾,因此它不會將文件結尾視為應該報告的錯誤。
## type [Writer](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L24 "View Source")
```
type Writer struct {
Comma rune // 字段分隔符(NewWriter將之設為',')
UseCRLF bool // 如為真,則換行時使用\r\n
// 內含隱藏或非導出字段
}
```
Writer類型的值將記錄寫入一個csv編碼的文件。
NewWriter返回的*Writer寫入記錄時,以換行結束記錄,用','分隔字段。在第一次調用Write或WriteAll之前,可以設置導出字段的細節。
Comma是字段分隔符。如果UseCRLF為真,Writer在每條記錄結束時用\r\n代替\n。
### func [NewWriter](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L31 "View Source")
```
func NewWriter(w io.Writer) *Writer
```
NewWriter返回一個寫入w的*Writer。
### func (\*Writer) [Write](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L40 "View Source")
```
func (w *Writer) Write(record []string) (err error)
```
向w中寫入一條記錄,會自行添加必需的引號。記錄是字符串切片,每個字符串代表一個字段。
### func (\*Writer) [WriteAll](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L107 "View Source")
```
func (w *Writer) WriteAll(records [][]string) (err error)
```
WriteAll方法使用Write方法向w寫入多條記錄,并在最后調用Flush方法清空緩存。
### func (\*Writer) [Flush](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L96 "View Source")
```
func (w *Writer) Flush()
```
將緩存中的數據寫入底層的io.Writer。要檢查Flush時是否發生錯誤的話,應調用Error方法。
### func (\*Writer) [Error](https://github.com/golang/go/blob/master/src/encoding/csv/writer.go#L101 "View Source")
```
func (w *Writer) Error() error
```
Error返回在之前的Write方法和Flush方法執行時出現的任何錯誤。
- 庫
- package achive
- package tar
- package zip
- package bufio
- package builtin
- package bytes
- package compress
- package bzip2
- package flate
- package gzip
- package lzw
- package zlib
- package container
- package heap
- package list
- package ring
- package crypto
- package aes
- package cipher
- package des
- package dsa
- package ecdsa
- package elliptic
- package hmac
- package md5
- package rand
- package rc4
- package rsa
- package sha1
- package sha256
- package sha512
- package subtle
- package tls
- package x509
- package pkix
- package database
- package sql
- package driver
- package encoding
- package ascii85
- package asn1
- package base32
- package base64
- package binary
- package csv
- package gob
- package hex
- package json
- package pem
- package xml
- package errors
- package expvar
- package flag
- package fmt
- package go
- package doc
- package format
- package parser
- package printer
- package hash
- package adler32
- package crc32
- package crc64
- package fnv
- package html
- package template
- package image
- package color
- package palette
- package draw
- package gif
- package jpeg
- package png
- package index
- package suffixarray
- package io
- package ioutil
- package log
- package syslog
- package math
- package big
- package cmplx
- package rand
- package mime
- package multipart
- package net
- package http
- package cgi
- package cookiejar
- package fcgi
- package httptest
- package httputil
- package pprof
- package mail
- package rpc
- package jsonrpc
- package smtp
- package textproto
- package url
- package os
- package exec
- package signal
- package user
- package path
- package filepath
- package reflect
- package regexp
- package runtime
- package cgo
- package debug
- package pprof
- package race
- package sort
- package strconv
- package strings
- package sync
- package atomic
- package text
- package scanner
- package tabwriter
- package template
- package time
- package unicode
- package utf16
- package utf8
- package unsafe