Преобразование XLSX в CSV с Perl при сохранении кодировки - PullRequest
3 голосов
/ 24 февраля 2020

Я разработчик BI, работающий со сценариями perl в качестве моего ETL - я получаю данные по электронной почте, беру файл, анализирую его и помещаю sh в базу данных. Большинство файлов являются CSV, но иногда у меня есть файл XLSX.

Я использовал Spreadsheet :: XLSX для преобразования, но я заметил, что вывод CSV выходит с неправильной кодировкой (необходимо быть UTF8, потому что акценты и иностранные языки. Чего мне не хватает?

Большое спасибо всем!

sub convert_to_csv {
    my $input_file = $_[0];
    my ( $filename, $extension ) = split( '\.', $input_file );
    open( format_file, ">:**encoding(utf-8)**", "$filename.csv" ) or die "could not open out file $!\n";
    my $excel = Spreadsheet::XLSX->new($input_file);
    my $line;
    foreach my $sheet ( @{ $excel->{Worksheet} } ) {

        #printf( "Sheet: %s\n", $sheet->{Name} );
        $sheet->{MaxRow} ||= $sheet->{MinRow};
        foreach my $row ( $sheet->{MinRow} .. $sheet->{MaxRow} ) {
            $sheet->{MaxCol} ||= $sheet->{MinCol};
            foreach my $col ( $sheet->{MinCol} .. $sheet->{MaxCol} ) {
                my $cell = $sheet->{Cells}[$row][$col];
                if ($cell) {
                    my $trimcell;
                    $trimcell = $cell->value();
                    print STDERR "cell: $trimcell\n"; ## Just for the tests so I don't have to open the file to see if it's ok
                    $trimcell =~ s/^\s+|\s+$//g;  ## Just to make sure I don't have extra spaces
                    $line .= "\"" . $trimcell  . "\",";
                }
            }
            chomp($line);
            if ($line =~ /Grand Total/){} ##customized for the files
            else {
            print format_file "$line\n";
            $line = '';
        }
        }
    }
    close format_file;
}

1 Ответ

1 голос
/ 02 марта 2020

Мои знания основаны на использовании ETL::Pipeline, и он использует Spreadsheet::XLSX для чтения .xlsx-файлов. Но я знаю, какие поля являются UTF-8

Я написал локальный ETL::Pipeline модуль для обработки выходных данных для файлов Excel

use Encode qw(decode encode);

$ra_rec->{name} = decode( 'UTF-8', $ra_rec->{name}, Encode::FB_CROAK );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...