@@ -22,7 +22,6 @@ package main
2222import (
2323 "encoding/csv"
2424 "fmt"
25- "io"
2625 "os"
2726 "strings"
2827
@@ -64,6 +63,11 @@ Filter a 10 row CSV file for rows 1,4,6 (top most row is one)
6463Filter a 10 row CSV file for rows 1,4,6 from file named "10row.csv"
6564
6665 %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
6771`
6872
6973 // Standard options
@@ -84,54 +88,9 @@ Filter a 10 row CSV file for rows 1,4,6 from file named "10row.csv"
8488 skipHeaderRow bool
8589 outputRows string
8690 delimiter string
91+ randomRows int
8792)
8893
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-
13594func main () {
13695 app := cli .NewCli (datatools .Version )
13796 appName := app .AppName ()
@@ -142,7 +101,7 @@ func main() {
142101 // Add Help Docs
143102 app .AddHelp ("license" , []byte (fmt .Sprintf (datatools .LicenseText , appName , datatools .Version )))
144103 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 )))
146105
147106 // Standard options
148107 app .BoolVar (& showHelp , "h,help" , false , "display help" )
@@ -159,6 +118,7 @@ func main() {
159118 app .StringVar (& outputRows , "row,rows" , "" , "output specified rows in order (e.g. -row 1,5,2:4))" )
160119 app .BoolVar (& skipHeaderRow , "skip-header-row" , false , "skip the header row (alias for -row 2:" )
161120 app .BoolVar (& showHeader , "header" , false , "display the header row (alias for '-rows 1')" )
121+ app .IntVar (& randomRows , "random" , 0 , "return N randomly selected rows" )
162122
163123 // Parse env and options
164124 app .Parse ()
@@ -200,6 +160,11 @@ func main() {
200160 os .Exit (0 )
201161 }
202162
163+ if randomRows > 0 {
164+ datatools .CSVRandomRows (app .In , app .Out , app .Eout , showHeader , randomRows , delimiter )
165+ os .Exit (0 )
166+ }
167+
203168 if showHeader == true {
204169 outputRows = "1"
205170 }
@@ -221,7 +186,7 @@ func main() {
221186 rowNos [i ] = 0
222187 }
223188 }
224- CSVRows (app .In , app .Out , app .Eout , rowNos , delimiter )
189+ datatools . CSVRows (app .In , app .Out , app .Eout , rowNos , delimiter )
225190 os .Exit (0 )
226191 }
227192
0 commit comments