X-Git-Url: http://git.rot13.org/?p=MojoFacets.git;a=blobdiff_plain;f=lib%2FMojoFacets%2FImport%2FCSV.pm;fp=lib%2FMojoFacets%2FImport%2FCSV.pm;h=6ab33951858e6cb48f520fca6d52ee798e88a2d9;hp=d87916927cf98fce167d43b9f3537895dfa30395;hb=2d84b2be05f2718b653bd2acb8823a45b371fe13;hpb=65ae9cfb8b794b3cd74d76e760626482df221127 diff --git a/lib/MojoFacets/Import/CSV.pm b/lib/MojoFacets/Import/CSV.pm index d879169..6ab3395 100644 --- a/lib/MojoFacets/Import/CSV.pm +++ b/lib/MojoFacets/Import/CSV.pm @@ -20,7 +20,7 @@ sub _split_line { my $v; if ( $line =~ s/^"// ) { $line =~ s/""/_qq_/gc; - $line =~ s/^\s*([^"]+)\s*"\Q$delimiter\E?// || die "can't parse $line"; + $line =~ s/^\s*([^"]*)\s*"\Q$delimiter\E?// || die "can't parse [$line] ",dump(@v); $v = $1; } elsif ( $line =~ s/^\s*([^\Q$delimiter\E]+)\s*\Q$delimiter\E?// ) { $v = $1; @@ -31,7 +31,9 @@ sub _split_line { } $v =~ s/^\s*(.+?)\s*$/$1/; + $v = $null if $v eq '_qq_'; # "" field which is not first one $v =~ s/_qq_/"/g; + $v =~ s/_LF_/\n/g; push @v, $v; } @@ -51,6 +53,11 @@ sub data { warn "decoding ", length($data), " bytes using $encoding\n"; $data = decode($encoding, $data); + # multi-line strings + while ( $data =~ s/(,"[^"]*)[\n\r]+([^"]*)/$1_LF_$2/sg ) { + warn "multi-line quoted CSV data found"; + } + my @lines = split(/\r?\n/, $data); $data = { items => [] };