csv: fix parse error of last empty field on unquoted line (#10083)

pull/10101/head
Henrique 2021-05-13 11:51:07 -03:00 committed by GitHub
parent 1086b4ac5e
commit e0a3c5384f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 3 deletions

View File

@ -134,7 +134,7 @@ fn (mut r Reader) read_record() ?[]string {
need_read = false
keep_raw = false
}
if line[0] != `"` { // not quoted
if line.len == 0 || line[0] != `"` { // not quoted
j := line.index(r.delimiter.ascii_str()) or {
// last
fields << line[..line.len]
@ -160,9 +160,10 @@ fn (mut r Reader) read_record() ?[]string {
if next == r.delimiter {
fields << line[..j]
if j + 2 == line.len {
break
line = ''
} else {
line = line[j + 2..]
}
line = line[j + 2..]
continue
}
}

View File

@ -111,11 +111,50 @@ fn test_last_field_empty() {
} else if row_count == 3 {
assert row[0] == 'two'
assert row[1] == 'second'
assert row[2] == ''
}
}
assert row_count == 3
}
fn test_empty_fields_no_quotes() {
data := '1,2,3,4\n,6,7,8\n9,,11,12\n13,14,,16\n17,18,19,\n'
mut csv_reader := csv.new_reader(data)
mut row_count := 0
for {
row := csv_reader.read() or { break }
row_count++
if row_count == 1 {
assert row[0] == '1'
assert row[1] == '2'
assert row[2] == '3'
assert row[3] == '4'
} else if row_count == 2 {
assert row[0] == ''
assert row[1] == '6'
assert row[2] == '7'
assert row[3] == '8'
} else if row_count == 3 {
assert row[0] == '9'
assert row[1] == ''
assert row[2] == '11'
assert row[3] == '12'
} else if row_count == 4 {
assert row[0] == '13'
assert row[1] == '14'
assert row[2] == ''
assert row[3] == '16'
} else if row_count == 5 {
assert row[0] == '17'
assert row[1] == '18'
assert row[2] == '19'
assert row[3] == ''
}
}
assert row_count == 5
}
fn test_empty_line() {
data := '"name","description","value"\n\n\n"one","first","1"\n\n"two","second",\n'
mut csv_reader := csv.new_reader(data)