This works for me....
use Text::CSV;
my @rows;
my $csv = Text::CSV->new ( { binary => 1 } ) # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $fh, "<:encoding(utf8)", "1.csv" or die "1.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
#$row->[2] =~ m/pattern/ or next; # 3rd field should match
push @rows, $row;
}
$csv->eof or $csv->error_diag();
close $fh;
my $x=0;
open (OUT, ">","out.csv");
for (@rows){
$x++;
if($x==1){
print OUT "@$_\n"; #prints out the header fields
next;
}
print OUT "\"";
for (@$_){ #this runs through the fields one at a time
my $rec=$_;
if(/^X\'/){
$rec =~ s/^X\'//eg;
$rec =~ s/\'$//eg;
$rec=~s/([a-fA-F0-9]{2})/chr(hex $1)/eg;
$rec=~s/\n//eg;
$rec=~s/\r//eg;
}
print OUT "$rec\"\,\"";
}
print OUT "\n";
}
close OUT;
Here is my input file
cn,name,last,lang,city,country,unknown,postal_code,phone1,phone2,first,country,unknown2,street,other_name,email,unknown3,unknown4
"CN=BERRY Richard,OU=TestFinance,OU=HR,OU=CORP,OU=CR,DC=mycorp,DC=com","BERRY Richard",BERRY,FR,"Puylouvier",FRANCE,,56000,"+33 1 23 45 67 89","+ 33 1 23 45 67 80",Richard,FRANCE,IT,X'332c206176656e7565204e6577746f6e0d0a',Bob.Malone,Richard.BERRY@mycorp.net," -",
"CN=BERRY Richard,OU=TestFinance,OU=HR,OU=CORP,OU=CR,DC=mycorp,DC=com","BERRY Richard",BERRY,FR,"Puylouvier",FRANCE,,56000,"+33 1 23 45 67 89","+ 33 1 23 45 67 80",Richard,FRANCE,IT,X'332c206176656e7565204e6577746f6e0d0a',Bob.Malone,Richard.BERRY@mycorp.net," -",
"CN=BERRY Richard,OU=TestFinance,OU=HR,OU=CORP,OU=CR,DC=mycorp,DC=com","BERRY Richard",BERRY,FR,"Puylouvier",FRANCE,,56000,"+33 1 23 45 67 89","+ 33 1 23 45 67 80",Richard,FRANCE,IT,X'332c206176656e7565204e6577746f6e0d0a',Bob.Malone,Richard.BERRY@mycorp.net," -",
"CN=BERRY Richard,OU=TestFinance,OU=HR,OU=CORP,OU=CR,DC=mycorp,DC=com","BERRY Richard",BERRY,FR,"Puylouvier",FRANCE,,56000,"+33 1 23 45 67 89","+ 33 1 23 45 67 80",Richard,FRANCE,IT,X'332c206176656e7565204e6577746f6e0d0a',Bob.Malone,Richard.BERRY@mycorp.net," -",