csv: fix error of read() (#9193)
parent
568faeed77
commit
b64d781a20
|
@ -17,7 +17,7 @@ struct Reader {
|
||||||
// not used yet
|
// not used yet
|
||||||
// has_header bool
|
// has_header bool
|
||||||
// headings []string
|
// headings []string
|
||||||
data string
|
data string
|
||||||
pub mut:
|
pub mut:
|
||||||
delimiter byte
|
delimiter byte
|
||||||
comment byte
|
comment byte
|
||||||
|
@ -59,7 +59,7 @@ pub fn (mut r Reader) read() ?[]string {
|
||||||
fn (mut r Reader) read_line() ?string {
|
fn (mut r Reader) read_line() ?string {
|
||||||
// last record
|
// last record
|
||||||
if r.row_pos == r.data.len {
|
if r.row_pos == r.data.len {
|
||||||
return err_eof
|
return csv.err_eof
|
||||||
}
|
}
|
||||||
le := if r.is_mac_pre_osx_le { '\r' } else { '\n' }
|
le := if r.is_mac_pre_osx_le { '\r' } else { '\n' }
|
||||||
mut i := r.data.index_after(le, r.row_pos)
|
mut i := r.data.index_after(le, r.row_pos)
|
||||||
|
@ -71,7 +71,7 @@ fn (mut r Reader) read_line() ?string {
|
||||||
r.is_mac_pre_osx_le = true
|
r.is_mac_pre_osx_le = true
|
||||||
} else {
|
} else {
|
||||||
// no valid line endings found
|
// no valid line endings found
|
||||||
return err_invalid_le
|
return csv.err_invalid_le
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No line ending on file
|
// No line ending on file
|
||||||
|
@ -89,10 +89,10 @@ fn (mut r Reader) read_line() ?string {
|
||||||
|
|
||||||
fn (mut r Reader) read_record() ?[]string {
|
fn (mut r Reader) read_record() ?[]string {
|
||||||
if r.delimiter == r.comment {
|
if r.delimiter == r.comment {
|
||||||
return err_comment_is_delim
|
return csv.err_comment_is_delim
|
||||||
}
|
}
|
||||||
if !valid_delim(r.delimiter) {
|
if !valid_delim(r.delimiter) {
|
||||||
return err_invalid_delim
|
return csv.err_invalid_delim
|
||||||
}
|
}
|
||||||
mut need_read := true
|
mut need_read := true
|
||||||
mut keep_raw := false
|
mut keep_raw := false
|
||||||
|
@ -146,13 +146,15 @@ fn (mut r Reader) read_record() ?[]string {
|
||||||
next := line[j + 1]
|
next := line[j + 1]
|
||||||
if next == r.delimiter {
|
if next == r.delimiter {
|
||||||
fields << line[..j]
|
fields << line[..j]
|
||||||
line = line[j..]
|
if j + 2 == line.len {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
line = line[j + 2..]
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
line = line[1..]
|
|
||||||
}
|
}
|
||||||
if i <= -1 && fields.len == 0 {
|
if i <= -1 && fields.len == 0 {
|
||||||
return err_invalid_delim
|
return csv.err_invalid_delim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fields
|
return fields
|
||||||
|
|
|
@ -173,3 +173,32 @@ fn test_field_multiple_line() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_field_quotes_for_parts() {
|
||||||
|
data := 'a1,"b1",c1\n"a2",b2,c2\na3,b3,"c3"\na4,b4,c4\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] == 'a1'
|
||||||
|
assert row[1] == 'b1'
|
||||||
|
assert row[2] == 'c1'
|
||||||
|
} else if row_count == 2 {
|
||||||
|
assert row[0] == 'a2'
|
||||||
|
assert row[1] == 'b2'
|
||||||
|
assert row[2] == 'c2'
|
||||||
|
} else if row_count == 3 {
|
||||||
|
assert row[0] == 'a3'
|
||||||
|
assert row[1] == 'b3'
|
||||||
|
assert row[2] == 'c3'
|
||||||
|
} else if row_count == 4 {
|
||||||
|
assert row[0] == 'a4'
|
||||||
|
assert row[1] == 'b4'
|
||||||
|
assert row[2] == 'c4'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue