Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Perl 5中将此Unicode表导出为CSV?_Sql_Perl_Unicode_Csv - Fatal编程技术网

Sql 如何在Perl 5中将此Unicode表导出为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");

我有一个表,里面有一些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");
  $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 ]);
}