Skip to content

Commit ae24e0d

Browse files
authored
Merge pull request #948 from devlights/add-csv-fieldsperrecord-example
Add csvop/fields_per_record.go
2 parents a989651 + a08f31a commit ae24e0d

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

examples/basic/csvop/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ func NewRegister() mapping.Register {
1717
func (*register) Regist(m mapping.ExampleMapping) {
1818
m["csv_read"] = Read
1919
m["csv_write"] = Write
20+
m["csv_fieldsperrecord"] = FieldsPerRecord
2021
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package csvop
2+
3+
import (
4+
"bytes"
5+
"encoding/csv"
6+
"fmt"
7+
)
8+
9+
// FieldsPerRecord は、csv.Reader.FieldsPerRecordのサンプルです。
10+
//
11+
// csv.Reader.FieldsPerRecord は設定する値によって挙動が変わる。
12+
//
13+
// - 「0より大きな正の値」を設定すると、その列数でない場合 *csv.ParseError が発生する
14+
// - 「0」を指定すると、最初の行の列数を基準として解析し、その列数でない場合 *csv.ParseError が発生する
15+
// - 「負の値」 を設定すると列が不揃いでもエラーにならない
16+
//
17+
// REFERENCES:
18+
// - https://pkg.go.dev/encoding/csv@go1.25.3#Reader.FieldsPerRecord
19+
func FieldsPerRecord() error {
20+
var (
21+
data []byte
22+
)
23+
data = fmt.Appendln(data, "hello,world")
24+
data = fmt.Appendln(data, "world,hello")
25+
data = fmt.Appendln(data, "HELLO,WORLD,999") // ここだけ列が不揃い
26+
27+
//
28+
// FieldsPerRecordの値が「0より大きな正の値」
29+
// (指定した列数で無い場合エラーとなる)
30+
//
31+
{
32+
var (
33+
buf = bytes.NewBuffer(data)
34+
reader = csv.NewReader(buf)
35+
record []string
36+
err error
37+
)
38+
reader.FieldsPerRecord = 2
39+
40+
for i := 0; ; i++ {
41+
if record, err = reader.Read(); err != nil {
42+
fmt.Printf("[0より大きな正の値] [%d] %T: %s\n", i, err, err)
43+
break
44+
}
45+
46+
fmt.Printf("[0より大きな正の値] [%d] %v\n", i, record)
47+
}
48+
}
49+
50+
//
51+
// FieldsPerRecordの値が「0」
52+
// (先頭レコードの列数を基準として処理する)
53+
//
54+
{
55+
var (
56+
buf = bytes.NewBuffer(data)
57+
reader = csv.NewReader(buf)
58+
record []string
59+
err error
60+
)
61+
reader.FieldsPerRecord = 0
62+
63+
for i := 0; ; i++ {
64+
if record, err = reader.Read(); err != nil {
65+
fmt.Printf("[0        ] [%d] %T: %s\n", i, err, err)
66+
break
67+
}
68+
69+
fmt.Printf("[0        ] [%d] %v\n", i, record)
70+
}
71+
}
72+
73+
//
74+
// FieldsPerRecordの値が「負の値」
75+
// (列数が不揃いでもエラーとならない)
76+
//
77+
{
78+
var (
79+
buf = bytes.NewBuffer(data)
80+
reader = csv.NewReader(buf)
81+
record []string
82+
err error
83+
)
84+
reader.FieldsPerRecord = -1
85+
86+
for i := 0; ; i++ {
87+
if record, err = reader.Read(); err != nil {
88+
fmt.Printf("[負の値      ] [%d] %T: %s\n", i, err, err)
89+
break
90+
}
91+
92+
fmt.Printf("[負の値      ] [%d] %v\n", i, record)
93+
}
94+
}
95+
96+
return nil
97+
98+
/*
99+
$ task
100+
task: [run] ./try-golang -onetime
101+
102+
ENTER EXAMPLE NAME: csv_fields
103+
104+
[Name] "csv_fieldsperrecord"
105+
[0より大きな正の値] [0] [hello world]
106+
[0より大きな正の値] [1] [world hello]
107+
[0より大きな正の値] [2] *csv.ParseError: record on line 3: wrong number of fields
108+
[0        ] [0] [hello world]
109+
[0        ] [1] [world hello]
110+
[0        ] [2] *csv.ParseError: record on line 3: wrong number of fields
111+
[負の値      ] [0] [hello world]
112+
[負の値      ] [1] [world hello]
113+
[負の値      ] [2] [HELLO WORLD 999]
114+
[負の値      ] [3] *errors.errorString: EOF
115+
116+
117+
[Elapsed] 352.396µs
118+
*/
119+
}

0 commit comments

Comments
 (0)