Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/basic/csvop/examples.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ func NewRegister() mapping.Register {
func (*register) Regist(m mapping.ExampleMapping) {
m["csv_read"] = Read
m["csv_write"] = Write
m["csv_fieldsperrecord"] = FieldsPerRecord
}
119 changes: 119 additions & 0 deletions examples/basic/csvop/fields_per_record.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package csvop

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

// FieldsPerRecord は、csv.Reader.FieldsPerRecordのサンプルです。
//
// csv.Reader.FieldsPerRecord は設定する値によって挙動が変わる。
//
// - 「0より大きな正の値」を設定すると、その列数でない場合 *csv.ParseError が発生する
// - 「0」を指定すると、最初の行の列数を基準として解析し、その列数でない場合 *csv.ParseError が発生する
// - 「負の値」 を設定すると列が不揃いでもエラーにならない
//
// REFERENCES:
// - https://pkg.go.dev/encoding/csv@go1.25.3#Reader.FieldsPerRecord
func FieldsPerRecord() error {
var (
data []byte
)
data = fmt.Appendln(data, "hello,world")
data = fmt.Appendln(data, "world,hello")
data = fmt.Appendln(data, "HELLO,WORLD,999") // ここだけ列が不揃い

//
// FieldsPerRecordの値が「0より大きな正の値」
// (指定した列数で無い場合エラーとなる)
//
{
var (
buf = bytes.NewBuffer(data)
reader = csv.NewReader(buf)
record []string
err error
)
reader.FieldsPerRecord = 2

for i := 0; ; i++ {
if record, err = reader.Read(); err != nil {
fmt.Printf("[0より大きな正の値] [%d] %T: %s\n", i, err, err)
break
}

fmt.Printf("[0より大きな正の値] [%d] %v\n", i, record)
}
}

//
// FieldsPerRecordの値が「0」
// (先頭レコードの列数を基準として処理する)
//
{
var (
buf = bytes.NewBuffer(data)
reader = csv.NewReader(buf)
record []string
err error
)
reader.FieldsPerRecord = 0

for i := 0; ; i++ {
if record, err = reader.Read(); err != nil {
fmt.Printf("[0        ] [%d] %T: %s\n", i, err, err)
break
}

fmt.Printf("[0        ] [%d] %v\n", i, record)
}
}

//
// FieldsPerRecordの値が「負の値」
// (列数が不揃いでもエラーとならない)
//
{
var (
buf = bytes.NewBuffer(data)
reader = csv.NewReader(buf)
record []string
err error
)
reader.FieldsPerRecord = -1

for i := 0; ; i++ {
if record, err = reader.Read(); err != nil {
fmt.Printf("[負の値      ] [%d] %T: %s\n", i, err, err)
break
}

fmt.Printf("[負の値      ] [%d] %v\n", i, record)
}
}

return nil

/*
$ task
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: csv_fields

[Name] "csv_fieldsperrecord"
[0より大きな正の値] [0] [hello world]
[0より大きな正の値] [1] [world hello]
[0より大きな正の値] [2] *csv.ParseError: record on line 3: wrong number of fields
[0        ] [0] [hello world]
[0        ] [1] [world hello]
[0        ] [2] *csv.ParseError: record on line 3: wrong number of fields
[負の値      ] [0] [hello world]
[負の値      ] [1] [world hello]
[負の値      ] [2] [HELLO WORLD 999]
[負の値      ] [3] *errors.errorString: EOF


[Elapsed] 352.396µs
*/
}