Sql 如何在Perl 5中将此Unicode表导出为CSV?
我有一个表,里面有一些Unicode。我知道Unicode数据很好,因为它在我们的Web服务器上显示为JSON很好。但由于某种原因,我生成的CSV最终被破坏了。以下是我们当前的代码:Sql 如何在Perl 5中将此Unicode表导出为CSV?,sql,perl,unicode,csv,Sql,Perl,Unicode,Csv,我有一个表,里面有一些Unicode。我知道Unicode数据很好,因为它在我们的Web服务器上显示为JSON很好。但由于某种原因,我生成的CSV最终被破坏了。以下是我们当前的代码: my $csv = Text::CSV->new ({ eol => "\015\012" }); open my $fh, '>:encoding(utf8)', 'Foo.csv'; my $sth = $dbh->prepare("SELECT * FROM Foo");
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++;
}
有什么想法吗?除了编码问题之外,我认为不能保证
值总是以相同的顺序给出字段。每次调用hashref时,您可能会从fetchrow\u hashref
获得不同的hashref。解决方法是使用fetchrow\u arrayref
建议:
或者,如果您不想安装新模块:
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 ]);
}
如果您向我们展示预期和损坏的输出,这将有所帮助。:)
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 ]);
}