2010-01-12 3 views
3

테이블에 유니 코드가 있습니다. 우리 웹 서버에서 JSON으로 잘 나타나기 때문에 유니 코드 데이터는 괜찮습니다. 그러나 내가 생성하고있는 CSV가 어떤 이유로 망가져 버릴 것입니다. 현재 코드는 다음과 같습니다.이 유니 코드 테이블을 Perl 5에서 CSV로 내보내려면 어떻게해야합니까?

my $csv = Text::CSV->new ({ eol => "\015\012" }); 
    open my $fh, '>:encoding(utf8)', 'Foo.csv'; 
    my $sth = $dbh->prepare("SELECT * FROM Foo"); 
    $sth->execute(); 
    my $i = 0; 
    while (my $row = $sth->fetchrow_hashref) { 
    $csv->print($fh, [keys %$row]) if $i == 0; 
    $csv->print($fh, [values %$row]); 
    $i++; 
    } 

아이디어가 있으십니까?

+0

당신이 우리에게 기대 난도질 출력을 보여 주었다 경우가 도움이 될 것이다. :) –

답변

3

인코딩 문제 외에도 values이 항상 동일한 순서로 필드를 제공한다는 보장은 없다고 생각합니다. 전화를 할 때마다 fetchrow_hashref에서 다른 해시 참조가 표시 될 수 있습니다. 그 해결책은 fetchrow_arrayref을 사용하는 것입니다.

my $csv = Text::CSV::Encoded->new({ eol => "\015\012" }); 
open my $fh, '>:raw', 'Foo.csv'; 
my $sth = $dbh->prepare("SELECT * FROM Foo"); 
$sth->execute(); 
$csv->print($fh, $sth->{NAME_lc}); # or NAME or NAME_uc 

while (my $row = $sth->fetchrow_arrayref) { 
    $csv->print($fh, $row); 
} 

을 또는 새 모듈을 설치하고 싶지 않는 경우 :

Text::CSVText::CSV::Encoded 권장

use Encode 'find_encoding'; 
my $utf8 = find_encoding('utf8'); 

my $csv = Text::CSV->new({ binary => 1, eol => "\015\012" }); 
open my $fh, '>:raw', 'Foo.csv'; 
my $sth = $dbh->prepare("SELECT * FROM Foo"); 
$sth->execute(); 
# I'm assuming your field names are ASCII: 
$csv->print($fh, $sth->{NAME_lc}); # or NAME or NAME_uc 

while (my $row = $sth->fetchrow_arrayref) { 
    $csv->print($fh, [ map { $utf8->encode($_) } @$row ]); 
} 
관련 문제