bitfield/script

Propose adding a delimeter to Column()

rmasci opened this issue · 10 comments

Right now Columns takes an int, and uses strings.Fields to split the line. I'd like to propose we add a delimiter, so that you could parse csv, semicolon, or pipe delimited files. The function would look like this:

func (p *Pipe) Column(col int, d ...string) *Pipe {
	var delim string
	if len(d) > 0 {
		delim = d[0]
	}
	return p.FilterScan(func(line string, w io.Writer) {
		var columns []string
		if delim == "" {
			columns = strings.Fields(line)
		} else {
			columns = strings.Split(line, delim)
		}
		if col > 0 && col <= len(columns) {
			fmt.Fprintln(w, columns[col-1])
		}
	})
}

d is a ...string means it takes 0 or more arguments, so if the user doesn't pass anything it still works maintaining compatibility with existing programs
Ex:

script.Exec(`echo "one two three"`).Columns(2).Stdout()

would still print 2. However

script.Exec(`echo "one,two,three"`).Columns(2, ",").Stdout() 

Would also print 2
Sort of a simple change, and it works for a case where I want to parse through comma separated lines. While I think it works, I might not be thinking of a use case where it would break existing code.

Hey @rmasci Can I work on this issue?

What about something like:

script.File("data.csv").Fields(",").Columns(1, 3, 9).Stdout()

sounds nice to me if we can extend it to CSVs along with strings, Should I start working on it ?

rmasci commented
rmasci commented

Very cool! I'm inspired by nushell to think we should have more data-analysis capabilities like this in script. I don't have any concrete suggestions to make at the moment though. Some use cases would be welcome.