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 }