csv

package
v1.21.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 31, 2023 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

csvパッケージは、カンマ区切り値(CSV)ファイルを読み書きします。 多種多様なCSVファイルがありますが、このパッケージはRFC 4180で説明されている形式をサポートしています。

CSVファイルには、レコードごとに1つ以上のフィールドを含むゼロ以上のレコードが含まれています。 各レコードは改行文字で区切られます。最後のレコードはオプションで改行文字に続くことができます。

field1,field2,field3

空白はフィールドの一部と見なされます。

改行文字の前のキャリッジリターンは、静かに削除されます。

空行は無視されます。空白文字のみで構成される行(末尾の改行文字を除く)は、空行と見なされません。

クォート文字 "で始まり、終わるフィールドは、クォートフィールドと呼ばれます。 開始と終了の引用符はフィールドの一部ではありません。

ソース:

normal string,"quoted-field"

は、次のフィールドを生成します。

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

クォートフィールド内の引用符の後に2番目の引用符が続く場合、 1つの引用符として扱われます。

"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

Examples

Constants

This section is empty.

Variables

View Source
var (
	ErrBareQuote  = errors.New("bare \" in non-quoted-field")
	ErrQuote      = errors.New("extraneous or missing \" in quoted-field")
	ErrFieldCount = errors.New("wrong number of fields")

	// Deprecated: ErrTrailingComma はもう使用されません。
	ErrTrailingComma = errors.New("extra delimiter at end of line")
)

ParseError.Errで返される可能性のあるエラーです。

Functions

This section is empty.

Types

type ParseError

type ParseError struct {
	StartLine int
	Line      int
	Column    int
	Err       error
}

ParseErrorは、解析エラーの場合に返されます。 行番号は1から始まり、列番号は0から始まります。

func (*ParseError) Error

func (e *ParseError) Error() string

func (*ParseError) Unwrap added in v1.13.0

func (e *ParseError) Unwrap() error

type Reader

type Reader struct {
	// Commaはフィールドの区切り文字です。
	// NewReaderによってカンマ(',')に設定されます。
	// Commaは有効なルーンである必要があり、\r、\n、
	// またはUnicode置換文字(0xFFFD)であってはなりません。
	Comma rune

	// Commentが0でない場合、Comment文字はコメント文字です。
	// 先行する空白がないComment文字で始まる行は無視されます。
	// 先行する空白がある場合、TrimLeadingSpaceがtrueであっても、Comment文字はフィールドの一部になります。
	// Commentは有効なルーンである必要があり、\r、\n、
	// またはUnicode置換文字(0xFFFD)であってはなりません。
	// また、Commaと等しくてはなりません。
	Comment rune

	// FieldsPerRecordは、レコードごとに期待されるフィールド数です。
	// FieldsPerRecordが正の場合、Readは各レコードが指定されたフィールド数を持つことを要求します。
	// FieldsPerRecordが0の場合、Readは最初のレコードのフィールド数に設定し、
	// 以降のレコードは同じフィールド数を持つ必要があります。
	// FieldsPerRecordが負の場合、チェックは行われず、レコードは可変長のフィールド数を持つ場合があります。
	FieldsPerRecord int

	// LazyQuotesがtrueの場合、引用符は引用符で囲まれていないフィールドに表示される場合があります。
	LazyQuotes bool

	// TrimLeadingSpaceがtrueの場合、フィールドの先頭の空白は無視されます。
	// これは、フィールド区切り文字であるCommaが空白である場合でも行われます。
	TrimLeadingSpace bool

	// ReuseRecordは、パフォーマンスのために、Readの呼び出しが前回の呼び出しの返されたスライスのバッキング配列を共有するスライスを返すかどうかを制御します。
	// デフォルトでは、Readの各呼び出しは、呼び出し元が所有する新しく割り当てられたメモリを返します。
	ReuseRecord bool

	// Deprecated: TrailingComma はもう使用されません。
	TrailingComma bool
	// contains filtered or unexported fields
}

Readerは、CSVエンコードされたファイルからレコードを読み取ります。

NewReaderによって返された場合、ReaderはRFC 4180に準拠した入力を想定しています。 最初のReadまたはReadAll呼び出しの前に、エクスポートされたフィールドを変更して詳細をカスタマイズできます。

Readerは、入力のすべての\r\nシーケンスをプレーンな\nに変換するため、 複数行のフィールド値を含む場合でも、返されるデータが入力ファイルが使用する行末の規約に依存しないようにします。

Example
package main

import (
	"github.com/shogo82148/std/encoding/csv"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/io"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/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)
	}
}
Output:

[first_name last_name username]
[Rob Pike rob]
[Ken Thompson ken]
[Robert Griesemer gri]
Example (Options)

This example shows how csv.Reader can be configured to handle other types of CSV files.

package main

import (
	"github.com/shogo82148/std/encoding/csv"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/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)
}
Output:

[[first_name last_name username] [Rob Pike rob] [Ken Thompson ken] [Robert Griesemer gri]]

func NewReader

func NewReader(r io.Reader) *Reader

NewReaderは、rから読み取る新しいReaderを返します。

func (*Reader) FieldPos added in v1.17.0

func (r *Reader) FieldPos(field int) (line, column int)

FieldPosは、Readで最後に返されたスライス内の指定されたインデックスのフィールドの開始に対応する行と列を返します。 行と列の番号付けは1から始まります。列はルーンではなくバイトで数えられます。

インデックスが範囲外で呼び出された場合、panicします。

func (*Reader) InputOffset added in v1.19.0

func (r *Reader) InputOffset() int64

InputOffsetは、現在のリーダーの位置の入力ストリームバイトオフセットを返します。 オフセットは、最後に読み取られた行の終わりと次の行の始まりの場所を示します。

func (*Reader) Read

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

Readはrから1つのレコード(フィールドのスライス)を読み込みます。 レコードに予期しない数のフィールドが含まれている場合、 ReadはエラーErrFieldCountとともにレコードを返します。 パースできないフィールドが含まれている場合、 Readは部分的なレコードとパースエラーを返します。 部分的なレコードには、エラーが発生する前に読み取られたすべてのフィールドが含まれます。 読み取るデータがない場合、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まで読み込むように定義されているため、エラーとして扱いません。

Example
package main

import (
	"github.com/shogo82148/std/encoding/csv"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/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)
}
Output:

[[first_name last_name username] [Rob Pike rob] [Ken Thompson ken] [Robert Griesemer gri]]

type Writer

type Writer struct {
	Comma   rune
	UseCRLF bool
	// contains filtered or unexported fields
}

Writerは、CSVエンコーディングを使用してレコードを書き込みます。

NewWriterによって返された場合、Writerは改行で終わるレコードを書き込み、 フィールド区切り文字として「,」を使用します。 最初のWriteまたはWriteAll呼び出しの前に、エクスポートされたフィールドをカスタマイズすることができます。

Commaはフィールドの区切り文字です。

UseCRLFがtrueの場合、Writerは各出力行を\nではなく\r\nで終了します。

個々のレコードの書き込みはバッファリングされます。 すべてのデータが書き込まれた後、クライアントはFlushメソッドを呼び出して、 基礎となるio.Writerにすべてのデータが転送されたことを保証する必要があります。 発生したエラーは、Errorメソッドを呼び出して確認する必要があります。

Example
package main

import (
	"github.com/shogo82148/std/encoding/csv"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/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)
	}
}
Output:

first_name,last_name,username
Rob,Pike,rob
Ken,Thompson,ken
Robert,Griesemer,gri

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriterは、wに書き込む新しいWriterを返します。

func (*Writer) Error added in v1.1.0

func (w *Writer) Error() error

Errorは、以前のWriteまたはFlush中に発生したエラーを報告します。

func (*Writer) Flush

func (w *Writer) Flush()

Flushは、バッファリングされたデータを基礎となるio.Writerに書き込みます。 Flush中にエラーが発生したかどうかを確認するには、Errorを呼び出します。

func (*Writer) Write

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

Writeは、必要に応じてクォーティングを行い、単一のCSVレコードをwに書き込みます。 レコードは、各文字列が1つのフィールドである文字列のスライスです。 書き込みはバッファリングされるため、レコードが基礎となるio.Writerに書き込まれることを保証するには、 最終的にFlushを呼び出す必要があります。

func (*Writer) WriteAll

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

WriteAllは、Writeを使用して複数のCSVレコードをwに書き込み、 Flushを呼び出してからFlushからのエラーを返します。

Example
package main

import (
	"github.com/shogo82148/std/encoding/csv"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/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)
	}
}
Output:

first_name,last_name,username
Rob,Pike,rob
Ken,Thompson,ken
Robert,Griesemer,gri

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL