in reply to Handling an embedded newline in an unquoted CSV field

bluescreen's suggestion is a good one if your CSV is otherwise uncomplicated - i.e. no quoted fields.

But for complicated CSV, you really do want to use something like Text::CSV. It is a shame that, even setting Text::CSV's eol option, it can't handle this situation.

Best solution would probably be to pre-process each line, replacing the bare "\n" with another character, parse it with Text::CSV, and then replace it back again. Something like:

use Data::Dumper; use IO::Scalar; use Text::CSV; my $data = "Alice,123\r\n" . "Bob\nSmith,456\r\n"; my $io = IO::Scalar->new(\$data); $/ = "\r\n"; my $CSV = Text::CSV->new({ eol => $/, sep_char => q{,}, binary => 1, }); while (defined(my $line = <$io>)) { $line =~ s/\n(.)/\xFF$1/g; $CSV->parse($line); my @row = map { s/\xFF/\n/g; $_ } $CSV->fields; print Dumper(\@row); }