Documentation
¶
Overview ¶
csvパッケージは、カンマ区切り値(CSV)ファイルの読み書きを行います。 多くの種類のCSVファイルがありますが、このパッケージはRFC 4180で説明されている形式をサポートしています。 ただし、Writer はデフォルトで改行文字としてCRLFではなくLFを使用します。
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 ¶
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 ¶
ParseErrorは、解析エラーの場合に返されます。 行番号と行番号は1から始まります。
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に準拠した入力を想定しています。 最初の Reader.Read または Reader.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 (*Reader) FieldPos ¶ added in v1.17.0
FieldPosは、Readで最後に返されたスライス内の指定されたインデックスのフィールドの開始に対応する行と列を返します。 行と列の番号付けは1から始まります。列はルーンではなくバイトで数えられます。
インデックスが範囲外で呼び出された場合、panicします。
func (*Reader) InputOffset ¶ added in v1.19.0
InputOffsetは、現在のリーダーの位置の入力ストリームバイトオフセットを返します。 オフセットは、最後に読み取られた行の終わりと次の行の始まりの場所を示します。
func (*Reader) Read ¶
Readはrから1つのレコード(フィールドのスライス)を読み込みます。 レコードに予期しない数のフィールドが含まれている場合、 Readはエラー ErrFieldCount とともにレコードを返します。 パースできないフィールドが含まれている場合、 Readは部分的なレコードとパースエラーを返します。 部分的なレコードには、エラーが発生する前に読み取られたすべてのフィールドが含まれます。 読み取るデータがない場合、Readはnil、io.EOFを返します。 [Reader.ReuseRecord] がtrueの場合、返されるスライスは複数のRead呼び出し間で共有できます。
func (*Reader) ReadAll ¶
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 ¶
Writerは、CSVエンコーディングを使用してレコードを書き込みます。
NewWriter によって返された場合、Writerは改行で終わるレコードを書き込み、 フィールド区切り文字として「,」を使用します。 最初の Writer.Write または Writer.WriteAll 呼び出しの前に、エクスポートされたフィールドをカスタマイズすることができます。
[Writer.Comma] はフィールドの区切り文字です。
[Writer.UseCRLF] がtrueの場合、Writerは各出力行を\nではなく\r\nで終了します。
個々のレコードの書き込みはバッファリングされます。 すべてのデータが書き込まれた後、クライアントは Writer.Flush メソッドを呼び出して、 基礎となる io.Writer にすべてのデータが転送されたことを保証する必要があります。 発生したエラーは、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 (*Writer) Error ¶ added in v1.1.0
Errorは、以前の Writer.Write または Writer.Flush 中に発生したエラーを報告します。
func (*Writer) Flush ¶
func (w *Writer) Flush()
Flushは、バッファリングされたデータを基礎となる io.Writer に書き込みます。 Flush中にエラーが発生したかどうかを確認するには、Writer.Error を呼び出します。
func (*Writer) Write ¶
Writeは、必要に応じてクォーティングを行い、単一のCSVレコードをwに書き込みます。 レコードは、各文字列が1つのフィールドである文字列のスライスです。 書き込みはバッファリングされるため、レコードが基礎となる io.Writer に書き込まれることを保証するには、 最終的に Writer.Flush を呼び出す必要があります。
func (*Writer) WriteAll ¶
WriteAllは、Writer.Write を使用して複数のCSVレコードをwに書き込み、 Writer.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