master
Dominique Merle 3 years ago
parent 141d1b984b
commit 9bf8b7b126

@ -24,21 +24,20 @@ func (r CsvTallyReader) Read(input *io.Reader) (
grades []string,
err error,
) {
csvDelimiter := ',' // default value if our detector below fails
csvDelimiter := ' ' // default value if our detector below fails
csvQuote := '"'
// I. Read the whole input at once. Tried stream reading with io.Pipe but… buffer!
allData, _ := io.ReadAll(*input)
readerCloneA := strings.NewReader(string(allData))
readerCloneB := strings.NewReader(SanitizeInput(string(allData)))
allDataBytes, _ := io.ReadAll(*input)
allData := sanitizeInput(string(allDataBytes))
inputReaderForMeta := strings.NewReader(allData)
inputReaderForData := strings.NewReader(allData)
// I.a Detect the delimiter between values in the input (default is comma `,`)
delimiterDetector := detector.New()
delimiters := delimiterDetector.DetectDelimiter(readerCloneA, byte(csvQuote))
delimiters := delimiterDetector.DetectDelimiter(inputReaderForMeta, byte(csvQuote))
if 0 < len(delimiters) {
csvDelimiter = readFirstRune(delimiters[0])
} else {
csvDelimiter = ' ' // fallback on space -- use another detector instead of this
}
if 1 < len(delimiters) {
err = fmt.Errorf("too many delimiters: found `%s` and `%s`", delimiters[0], delimiters[1])
@ -46,7 +45,7 @@ func (r CsvTallyReader) Read(input *io.Reader) (
}
// I.b Read the actual CSV contents
csvReader := csv.NewReader(readerCloneB)
csvReader := csv.NewReader(inputReaderForData)
csvReader.Comma = csvDelimiter
csvRows, errReader := csvReader.ReadAll()
if errReader != nil {

@ -24,8 +24,8 @@ type Reader interface {
)
}
// SanitizeInput to help readers
func SanitizeInput(input string) string {
// sanitizeInput to help readers
func sanitizeInput(input string) string {
sanitized := input // inefficient, but makes code below more modular — TBD
// Remove duplicate spaces

Loading…
Cancel
Save