@@ -22,7 +22,6 @@ package main
22
22
import (
23
23
"encoding/csv"
24
24
"fmt"
25
- "io"
26
25
"os"
27
26
"strings"
28
27
@@ -64,6 +63,11 @@ Filter a 10 row CSV file for rows 1,4,6 (top most row is one)
64
63
Filter a 10 row CSV file for rows 1,4,6 from file named "10row.csv"
65
64
66
65
%s -i 10row.csv -row 1,4,6 > 3rows.csv
66
+
67
+ Filter 3 randomly selected rows from 10row.csv rendering new CSV with
68
+ a header row from 10row.csv.
69
+
70
+ %s -i 10row.csv -header=true -random=3
67
71
`
68
72
69
73
// Standard options
@@ -84,54 +88,9 @@ Filter a 10 row CSV file for rows 1,4,6 from file named "10row.csv"
84
88
skipHeaderRow bool
85
89
outputRows string
86
90
delimiter string
91
+ randomRows int
87
92
)
88
93
89
- func selectedRow (rowNo int , record []string , rowNos []int ) []string {
90
- if len (rowNos ) == 0 {
91
- return record
92
- }
93
- for _ , i := range rowNos {
94
- if i == rowNo {
95
- return record
96
- }
97
- }
98
- return nil
99
- }
100
-
101
- func CSVRows (in io.Reader , out io.Writer , eout io.Writer , rowNos []int , delimiter string ) {
102
- var err error
103
-
104
- r := csv .NewReader (in )
105
- w := csv .NewWriter (out )
106
- if delimiter != "" {
107
- r .Comma = datatools .NormalizeDelimiterRune (delimiter )
108
- w .Comma = datatools .NormalizeDelimiterRune (delimiter )
109
- }
110
- for i := 0 ; err != io .EOF ; i ++ {
111
- rec , err := r .Read ()
112
- if err == io .EOF {
113
- break
114
- }
115
- if err != nil {
116
- fmt .Fprintf (eout , "%s, %s (%T %+v)" , inputFName , err , rec , rec )
117
- os .Exit (1 )
118
- }
119
- row := selectedRow (i , rec , rowNos )
120
- if row != nil {
121
- if err := w .Write (row ); err != nil {
122
- fmt .Fprintf (eout , "Error writing record to csv: %s (Row %T %+v)" , err , row , row )
123
- os .Exit (1 )
124
- }
125
- }
126
- }
127
- w .Flush ()
128
- err = w .Error ()
129
- if err != nil {
130
- fmt .Fprintf (eout , "%s\n " , err )
131
- os .Exit (1 )
132
- }
133
- }
134
-
135
94
func main () {
136
95
app := cli .NewCli (datatools .Version )
137
96
appName := app .AppName ()
@@ -142,7 +101,7 @@ func main() {
142
101
// Add Help Docs
143
102
app .AddHelp ("license" , []byte (fmt .Sprintf (datatools .LicenseText , appName , datatools .Version )))
144
103
app .AddHelp ("description" , []byte (fmt .Sprintf (description , appName )))
145
- app .AddHelp ("examples" , []byte (fmt .Sprintf (examples , appName , appName , appName , appName , appName , appName )))
104
+ app .AddHelp ("examples" , []byte (fmt .Sprintf (examples , appName , appName , appName , appName , appName , appName , appName )))
146
105
147
106
// Standard options
148
107
app .BoolVar (& showHelp , "h,help" , false , "display help" )
@@ -159,6 +118,7 @@ func main() {
159
118
app .StringVar (& outputRows , "row,rows" , "" , "output specified rows in order (e.g. -row 1,5,2:4))" )
160
119
app .BoolVar (& skipHeaderRow , "skip-header-row" , false , "skip the header row (alias for -row 2:" )
161
120
app .BoolVar (& showHeader , "header" , false , "display the header row (alias for '-rows 1')" )
121
+ app .IntVar (& randomRows , "random" , 0 , "return N randomly selected rows" )
162
122
163
123
// Parse env and options
164
124
app .Parse ()
@@ -200,6 +160,11 @@ func main() {
200
160
os .Exit (0 )
201
161
}
202
162
163
+ if randomRows > 0 {
164
+ datatools .CSVRandomRows (app .In , app .Out , app .Eout , showHeader , randomRows , delimiter )
165
+ os .Exit (0 )
166
+ }
167
+
203
168
if showHeader == true {
204
169
outputRows = "1"
205
170
}
@@ -221,7 +186,7 @@ func main() {
221
186
rowNos [i ] = 0
222
187
}
223
188
}
224
- CSVRows (app .In , app .Out , app .Eout , rowNos , delimiter )
189
+ datatools . CSVRows (app .In , app .Out , app .Eout , rowNos , delimiter )
225
190
os .Exit (0 )
226
191
}
227
192
0 commit comments