Excel с японскими (широкими) шрифтами - PullRequest
1 голос
/ 16 сентября 2010

Я работал над анализом файла Excel, в котором есть японский язык в некоторых ячейках.Используя Spreadsheet :: ParseExcel (версия 0.15) (я знаю, что он старше текущей версии), некоторые ячейки с символами ниже:

< 設定 B-100 コ ー ス >

отображаются как:

print Dumper $ oWkc -> {_ Value};

$ VAR1 = "\ x {ff1c}\ x {8a2d} \ x {5b9a} B- \ x {ff11} \ x {30b3} \ x {30fc} \ x {30b9} \ x {ff1e} ";

и

print $ oWkc -> {Val}."\ n";

[- 0

$ VAR1 = "\ x {ff1c} \ x {8a2d} \ x {5b9a} B- \ x {ff13} \ x {30b3} \ x {30fc} \ x {30b9} \ x {ff1e} ";

[- 0

Если я хочу напечатать эти значения в реальном окне, яЯ устанавливаю дескриптор файла STDOUT на «: utf8 », и мой терминал отображает кодировку utf-8 (в противном случае я получаю некоторое предупреждение о «широких символах»).Здесь я должен выбрать ячейки с помощью B-1 или B-2, но я не уверен, что следует установить в моем сценарии, чтобы эти символы можно было рассматривать как то, что я могу видеть их в STDOUT.

В настоящее время я использую регулярное выражение для преобразования этих широких символов в соответствующие им значения ASCII.Например, если я хочу сопоставить B-1, который хранится как 'B- \ x {ff11}', я буду

$oWkc->{_Value} =~ /([AB]-)(\x{ff11}|\x{ff12}|\x{ff13}/
my $lookup = $1.$2;
$lookup =~ s/\x{ff11}/1/;
$lookup =~ s/\x{ff12}/2/;
$lookup =~ s/\x{ff13}/3/;

Для справки, B-1, A-2 и т. Д. Эти значенияисходят из какого-то другого источника и в настоящее время находятся в диапазоне от A | B- [1-3].

Каков стандартный способ обработки этих широких символов?Я не могу использовать кодирование / декодирование и т. Д. Может ли кто-нибудь дать мне какое-то направление?

В настоящее время, хотя я могу выполнить работу с помощью регулярных выражений ...

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Хотя я не проверял это (я не собираюсь устанавливать модуль с марта 2001 года), модуль, по-видимому, уже декодирует в нативные строки Perl, поэтому вам не нужно много делать. Простой способ работает просто отлично, не нужно слишком усложнять эти замены.

use utf8;
my $val = '<設定B-1コース>';

# does it match A or B, followed by a dash, followed by a fullwidth 1,2 or 3?
$val =~ /(?:A|B)-[123]/;  # returns true/1
2 голосов
/ 16 сентября 2010

Чтобы иметь дело с многобайтовыми символами в Spreadsheet :: ParseExcel , вам необходимо выполнить обновление до последней версии и использовать форматтер FmtJapan. В последних версиях исправлено несколько ошибок, связанных с японским форматированием.

Вот пример:

#!/usr/bin/perl


use warnings;
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;

my $filename  = 'Test2000J.xls';
my $parser    = Spreadsheet::ParseExcel->new();
my $formatter = Spreadsheet::ParseExcel::FmtJapan->new();
my $workbook  = $parser->parse($filename, $formatter);

if ( !defined $workbook ) {
    die "Parsing error: ", $parser->error(), ".\n";
}

# Set your output encoding.
binmode STDOUT, ':encoding(cp932)';
# Or maybe this:
#binmode STDOUT, ':utf8';


for my $worksheet ( $workbook->worksheets() ) {

    print "Worksheet name: ", $worksheet->get_name(), "\n\n";

    my ( $row_min, $row_max ) = $worksheet->row_range();
    my ( $col_min, $col_max ) = $worksheet->col_range();

    for my $row ( $row_min .. $row_max ) {
        for my $col ( $col_min .. $col_max ) {

            my $cell = $worksheet->get_cell( $row, $col );
            next unless $cell;

            print "    Row, Col    = ($row, $col)\n";
            print "    Value       = ", $cell->value(),       "\n";
            print "    Unformatted = ", $cell->unformatted(), "\n";
            print "\n";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...