- 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] =~ /^"/);
- $arrData[$#arrData] =~ s/[\r\n]+$//;
- chop $arrData[$#arrData] if ($arrData[$#arrData] =~ /"$/);
- if (@arrData) {
- if ($arrData[0] eq '#-#' && $arrData[$#arrData] eq '#-#') {
- # Change of table with separators #-#
- return 1;
- } elsif ($fieldsNameRead && $arrData[0] eq 'tagfield') {
- # Change of table because we begin with field name with former field names read
- seek($dom, $pos, 0);
- return 1;
- }
- if (scalar(@$fields) == scalar(@arrData)) {
- if (!$fieldsNameRead) {
- # New table, we read the field names
- $fieldsNameRead = 1;
- for (my $i=0; $i < @arrData; $i++) {
- if ($arrData[$i] ne $fields->[$i]) {
- $fieldsNameRead = 0;
- last;
- }
- }
- if ($fieldsNameRead) {
- $fieldsStr = join(',', @$fields);
- $dataStr = '';
- map { $dataStr .= '?,';} @$fields;
- chop($dataStr) if ($dataStr);
- $updateStr = '';
- map { $updateStr .= $_ . '=?,';} @$fields;
- chop($updateStr) if ($updateStr);
+ my $csv = Text::CSV_XS->new ({ binary => 1 });
+ while ( my $row = $csv->getline($dom) ) {
+ my @fields = @$row;
+ @arrData = @fields;
+ next if scalar @arrData == grep { $_ eq '' } @arrData; # Emtpy lines
+ #$arrData[0] = substr($arrData[0], 1) if ($arrData[0] =~ /^"/);
+ #$arrData[$#arrData] =~ s/[\r\n]+$//;
+ #chop $arrData[$#arrData] if ($arrData[$#arrData] =~ /"$/);
+ if (@arrData) {
+ if ($arrData[0] eq '#-#' && $arrData[$#arrData] eq '#-#') {
+ # Change of table with separators #-#
+ return 1;
+ } elsif ($fieldsNameRead && $arrData[0] eq 'tagfield') {
+ # Change of table because we begin with field name with former field names read
+ seek($dom, $pos, 0);
+ return 1;
+ }
+ if (!$fieldsNameRead) {
+ # New table, we read the field names
+ $fieldsNameRead = 1;
+ $fields = [@arrData];
+ my $non_empty_fields = [ grep { $_ ne '' } @$fields ];
+ @empty_indexes = indexes { $_ eq '' } @$fields;
+ $fieldsStr = join(',', @$non_empty_fields);
+ $dataStr = '';
+ map { $dataStr .= '?,';} @$non_empty_fields;
+ chop($dataStr) if ($dataStr);
+ $updateStr = '';
+ map { $updateStr .= $_ . '=?,';} @$non_empty_fields;
+ chop($updateStr) if ($updateStr);
+ } else {
+ # Read data
+ my $j = 0;
+ my %dataFields = ();
+ my @values;
+ for my $value (@arrData) {
+ if ( grep { $_ == $j } @empty_indexes ) {
+ # empty field
+ } elsif ($frameworktype eq "authority"){
+ if ($fields->[$j] eq 'authtypecode' && $value ne $frameworkcode) {
+ $dataFields{$fields->[$j]} = $frameworkcode;
+ push @values, $frameworkcode;
+ } elsif ($fields->[$j] eq 'isurl' && defined $value && $value eq q{}) {
+ $dataFields{$fields->[$j]} = undef;
+ push @values, undef;
+ } else {
+ $dataFields{$fields->[$j]} = $value;
+ push @values, $value;