Hi, I found a little more time to look at your problem. I was recently dealing with a related issue.
There's a well-known bug in MS Excel's handling of character encodings in CSV files. You can read all about in on StackOverflow and elsewhere. The short answer is that you need to encode your CSV file not as UTF-8 but as UTF-16LE in order for Excel to recognize it properly.
Here is a cleaned-up version of your script. For input I used an .xlsx file containing the data you showed below. This creates a CSV file encoded in UTF-16, so you won't be able to read it as a text file in your terminal if the terminal is set to UTF-8. But Excel will read the file and display the contents correctly.
use strict; use warnings; use autodie; use Spreadsheet::Read qw/ ReadData rows /; use Text::CSV; my $outputFile = '1198074.csv'; my $inputFile = '1198074.xlsx'; my $book = ReadData( $inputFile ); my @writeRows; for my $row ( rows( $book->[1] ) ) { my ( $id, $last, $first, $pref ) = @{ $row }; push @writeRows, [ $pref || $first, $last, 'Static', 'Text' ]; } open my $fh, '>:encoding(UTF-16LE)', $outputFile; my $csv = Text::CSV->new( { binary => 1, eol => "\n", auto_diag => 1 } + ); $csv->print( $fh, $_ ) for @writeRows; close $fh; __END__
Hope this helps!
In reply to Re: XLSX to CSV with high ASCII characters
by 1nickt
in thread XLSX to CSV with high ASCII characters
by apu
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |