From: Gary Wright Date: 2010-02-02T03:01:29+09:00 Subject: [ruby-core:28000] Re: [Bug:trunk] some behavior changes of lib/csv.rb between 1.8 and 1.9 On Feb 1, 2010, at 9:10 AM, James Edward Gray II wrote: > On Feb 1, 2010, at 6:35 AM, NAKAMURA, Hiroshi wrote: > >> Hi jeg2, >> >> On Fri, Jan 29, 2010 at 02:13, James Edward Gray II >> wrote: >>>> 3) CSV.parse >>>> >>>> $ ruby18 -rcsv -ve 'p CSV.parse "\nfoo"' >>>> [[nil], ["foo"]] >>>> >>>> $ ruby19 -rcsv -ve 'p CSV.parse "\nfoo"' >>>> [[], ["foo"]] >>> >>> Yeah, the old CSV included some seemingly random nils in places. FasterCSV "corrects" this odd behavior. >> >> Please let me know what you think 'random'. >> >> 0% ruby18 -rcsv -e 'p ["", ",", ",,"].map { |c| CSV.parse_line(c) }' >> [[nil], [nil, nil], [nil, nil, nil]] >> 0% ruby19 -rcsv -e 'p ["", ",", ",,"].map { |c| CSV.parse_line(c) }' >> [nil, [nil, nil], [nil, nil, nil]] > > I just meant that I didn't understand how "" becomes [nil]. There's no data to read, so I don't get why we think there is a nil field. By calling parse_line, you are implicitly assuming that there is at least one line in the data set. So an empty line could arguably be interpreted as having one empty field while an empty dataset can't really be interpreted as having one empty line. I'm not familiar enough with CSV to know if this is a reasonable way of thinking about the problem. It seems to me that it hinges on the idea of what constitutes a record with no fields or if such a thing can actually exists (i.e. a record by definition includes at least one field, which might be empty). Gary Wright