@@ -34,23 +34,27 @@ Usage:
34
34
Alias:
35
35
lcsv
36
36
Options:
37
- --batch-size: int, how many records in one tikv transaction, default: 1000
37
+ --batch-size=<size> : int, how many records in one tikv transaction, default: 1000
38
38
Examples:
39
- loadcsv sample.csv
39
+ # load csv file to tikv
40
+ loadcsv sample.csv
41
+
42
+ # load csv file to tikv with key prefix: "prefix_"
40
43
loadcsv sample.csv "prefix_" --batch-size=100
44
+
45
+ # load csv file to tikv with key prefix and skip first row (header)
46
+ loadcsv sample.csv "prefix_" --batch-size=100 --skip-rows=1
41
47
`
42
48
return s
43
49
}
44
50
45
51
func (c LoadCsvCmd ) processCSV (prop * properties.Properties , rc io.Reader , keyPrefix []byte ) error {
46
52
r := csv .NewReader (rc )
47
- if _ , err := r .Read (); err != nil { //read header
48
- return err
49
- }
50
53
var cnt int
51
54
var batch []client.KV
52
55
53
56
batchSize := prop .GetInt (tcli .LoadFileOptBatchSize , 1000 )
57
+ skips := prop .GetInt (tcli .LoadFileoptSkipRows , 0 )
54
58
for {
55
59
rawRec , err := r .Read ()
56
60
if err != nil {
@@ -59,6 +63,13 @@ func (c LoadCsvCmd) processCSV(prop *properties.Properties, rc io.Reader, keyPre
59
63
}
60
64
return err
61
65
}
66
+ if skips > 0 {
67
+ skips --
68
+ continue
69
+ }
70
+ if len (rawRec ) != 2 {
71
+ return fmt .Errorf ("invalid csv record: %v, format should be: <key>,<value>" , rawRec )
72
+ }
62
73
k , _ := utils .GetStringLit (rawRec [0 ])
63
74
v , _ := utils .GetStringLit (rawRec [1 ])
64
75
cnt ++
@@ -74,7 +85,6 @@ func (c LoadCsvCmd) processCSV(prop *properties.Properties, rc io.Reader, keyPre
74
85
K : key ,
75
86
V : v ,
76
87
})
77
-
78
88
if len (batch ) == batchSize {
79
89
// do insert
80
90
err := client .GetTiKVClient ().BatchPut (context .TODO (), batch )
0 commit comments