github.com/jmigpin/editor@v1.6.0/util/parseutil/fields.go (about)

     1  package parseutil
     2  
     3  import "fmt"
     4  
     5  func ParseFields(s string, fieldSep rune) ([]string, error) {
     6  	sc := NewScanner()
     7  	sc.SetSrc([]byte(s))
     8  	esc := '\\'
     9  	fields := []string{}
    10  	for i := 0; ; i++ {
    11  		if sc.M.Eof() {
    12  			break
    13  		}
    14  
    15  		// field separator
    16  		if i > 0 {
    17  			if err := sc.M.Rune(fieldSep); err != nil {
    18  				return nil, fmt.Errorf("field separator: %w", err)
    19  			}
    20  		}
    21  
    22  		// field (can be empty)
    23  		pos0 := sc.Pos
    24  		for {
    25  			if sc.M.QuotedString2(esc, 3000, 3000) == nil {
    26  				continue
    27  			}
    28  			if sc.M.RuneAnyNot([]rune{fieldSep}) == nil {
    29  				continue
    30  			}
    31  			break
    32  		}
    33  		val := string(sc.Src[pos0:sc.Pos])
    34  		if u, err := UnquoteString(val, esc); err == nil {
    35  			val = u
    36  		}
    37  
    38  		// add field
    39  		fields = append(fields, val)
    40  	}
    41  	return fields, nil
    42  }