Skip to content

Commit 1f9bf58

Browse files
committed
Added a random row selector for csvrows, moved common functions from csvrow.go to package in csv.go
1 parent e79ec89 commit 1f9bf58

File tree

2 files changed

+15
-50
lines changed

2 files changed

+15
-50
lines changed

cmds/csvrows/csvrows.go

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ package main
2222
import (
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)
6463
Filter 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-
13594
func 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

datatools.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import (
3535
)
3636

3737
const (
38-
Version = `v0.0.21-pre`
38+
Version = `v0.0.22-pre`
3939

4040
LicenseText = `
4141
%s %s

0 commit comments

Comments
 (0)