Bug 6727 - Change on exporting and importing csv to deal with spurious CR/LF
authorSalvador Zaragoza Rubio <salvazm@masmedios.com>
Fri, 19 Aug 2011 10:33:05 +0000 (12:33 +0200)
committerChris Cormack <chrisc@catalyst.net.nz>
Thu, 25 Aug 2011 20:41:01 +0000 (08:41 +1200)
Function _export_table_csv modified to remove CR/LF in the data
from the database to built a correct csv file.

Function _import_table_csv modified to deal with CR/LF in the data
field. When a line is found with an unproper end (a data field has not
end quote), it's concatenated to a temporary buffer until the next
line ends ok and then it's proccessed.

Signed-off-by: Nicole C. Engard <nengard@bywatersolutions.com>
Signed-off-by: Ian Walls <ian.walls@bywatersolutions.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
C4/ImportExportFramework.pm

index 7f29e51..e518771 100755 (executable)
@@ -322,6 +322,7 @@ sub _export_table_csv
         my $data;
         while (my $hashRef = $sth->fetchrow_hashref) {
             for (@fields) {
+                $hashRef->{$_} =~ s/[\r\n]//g;
                 $$strCSV .= '"' . $hashRef->{$_} . '",';
             }
             chop $$strCSV;
@@ -1133,6 +1134,7 @@ sub _import_table_csv
     my ($dbh, $table, $frameworkcode, $dom, $PKArray, $fields2Delete, $fields) = @_;
 
     my $row = '';
+    my $partialRow = '';
     my $numFields = @$fields;
     my $fieldsNameRead = 0;
     my @arrData;
@@ -1145,6 +1147,17 @@ sub _import_table_csv
     my $pos = 0;
     while (<$dom>) {
         $row = $_;
+        # Check whether the line has an unfinished field, i.e., a field with CR/LF in its data
+        if ($row =~ /,"[^"]*[\r\n]+$/ || $row =~ /^[^"]+[\r\n]+$/) {
+            $row =~ s/[\r\n]+$//;
+            $partialRow .= $row;
+            next;
+        }
+        if ($partialRow) {
+            $row = $partialRow . $row;
+            $partialRow = '';
+        }
+        # Line OK, process it
         if ($row =~ /(?:".*?",?)+/) {
             @arrData = split('","', $row);
             $arrData[0] = substr($arrData[0], 1) if ($arrData[0] =~ /^"/);