From: Paul Borman Date: Mon, 17 Oct 2011 18:10:39 +0000 (-0700) Subject: csv: fix issue 2366 - overly aggressive TrimLeadingSpace X-Git-Tag: weekly.2011-10-18~48 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=eea86de656d74bafe7c76a5242eaa51d80e2b454;p=gostls13.git csv: fix issue 2366 - overly aggressive TrimLeadingSpace Address the issue coalescing two records together when TrimLeadingSpace is set to true. The input a,b, c,d,e Would result with a singled a,b,c,d,e record. With TrailingComma set to true it should give two records. With TrailingComma set to false it should be an error. Fixes #2366. R=golang-dev, go.peter.90, r CC=golang-dev https://golang.org/cl/5284046 --- diff --git a/src/pkg/csv/reader.go b/src/pkg/csv/reader.go index ea2c266a47..29ceeae85b 100644 --- a/src/pkg/csv/reader.go +++ b/src/pkg/csv/reader.go @@ -267,7 +267,7 @@ func (r *Reader) parseField() (haveField bool, delim int, err os.Error) { } if r.TrimLeadingSpace { - for unicode.IsSpace(rune) { + for rune != '\n' && unicode.IsSpace(rune) { rune, err = r.readRune() if err != nil { return false, 0, err @@ -355,7 +355,7 @@ func (r *Reader) parseField() (haveField bool, delim int, err os.Error) { c := r.column rune, err = r.readRune() if r.TrimLeadingSpace { - for unicode.IsSpace(rune) { + for rune != '\n' && unicode.IsSpace(rune) { rune, err = r.readRune() if err != nil { break diff --git a/src/pkg/csv/reader_test.go b/src/pkg/csv/reader_test.go index 0068bad1db..967f96b8d1 100644 --- a/src/pkg/csv/reader_test.go +++ b/src/pkg/csv/reader_test.go @@ -127,10 +127,9 @@ field"`, Output: [][]string{{`a""b`, `c`}}, }, { - Name: "BadDoubleQuotes", - Input: `a""b,c`, - Output: [][]string{{`a""b`, `c`}}, - Error: `bare " in non-quoted-field`, Line: 1, Column: 1, + Name: "BadDoubleQuotes", + Input: `a""b,c`, + Error: `bare " in non-quoted-field`, Line: 1, Column: 1, }, { Name: "TrimQuote", @@ -231,6 +230,23 @@ x,,, {"", "", "", ""}, }, }, + { + Name: "Issue 2366", + TrailingComma: true, + TrimLeadingSpace: true, + Input: "a,b,\nc,d,e", + Output: [][]string{ + {"a", "b", ""}, + {"c", "d", "e"}, + }, + }, + { + Name: "Issue 2366a", + TrailingComma: false, + TrimLeadingSpace: true, + Input: "a,b,\nc,d,e", + Error: "extra delimiter at end of line", + }, } func TestRead(t *testing.T) {