用于将sql查询导出到csv的Perl脚本

Scu*_*eve 3 sql csv oracle perl

下面的代码有效,但在Excel中打开时,所有数据都显示在一行(但不同的列)中.查询应该显示数据标题,第1行和第2行.另外,当我打开文件时,我收到一条警告:"你要打开的文件'xxxx.csv'的格式与由文件扩展名指定.验证文件是否已损坏...等.您要立即打开该文件吗?" 无论如何要解决这个问题?这也许是原因.

tldr; 导出到多行的csv - 而不仅仅是一行.修复Excel错误.谢谢!

#!/usr/bin/perl
use warnings;
use DBI;
use Text::CSV;


# local time variables
($sec,$min,$hr,$mday,$mon,$year) = localtime(time);
$mon++;
$year += 1900;

# set name of database to connect to
$database=MDLSDB1;

# connection to the database
my $dbh = DBI->connect("dbi:Oracle:$database", "", "")
or die "Can't make database connect: $DBI::errstr\n";

# some settings that you usually want for oracle 10 
$dbh->{LongReadLen} = 65535; 
$dbh->{PrintError} = 0;  

# sql statement to run
$sql="select * from eg.well where rownum < 3";

my $sth = $dbh->prepare($sql);
$sth->execute();


my $csv = Text::CSV->new ( { binary => 1 } )             
or die "Cannot use CSV: ".Text::CSV->error_diag (); 

open my $fh, ">:raw", "results-$year-$mon-$mday-$hr.$min.$sec.csv"; 

$csv->print($fh, $sth->{NAME});

while(my $row = $sth->fetchrow_arrayref){      

$csv->print($fh, $row);
}

close $fh or die "Failed to write CSV: $!"; 
Run Code Online (Sandbox Code Playgroud)

maw*_*urn 11

while(my $row = $sth->fetchrow_arrayref){   
  $csv->print($fh, $row);
  $csv->print($fh, "\n");
}
Run Code Online (Sandbox Code Playgroud)

CSV行由换行符分隔.只需在每行后添加换行符即可.

  • 我得到下一个错误:期望的字段是一个数组引用...对于`$ csv-> print($ fh,"\n");` (2认同)
  • @EugenKonkov:那行应该是`print $ fh"\n";`因为$ csv对象期望一个数组保存要打印的行.我提交了一个编辑,但需要进行审核. (2认同)