3

以下のコードは機能しますが、Excelで開くと、すべてのデータが1行(ただし異なる列)に表示されます。クエリは、データ見出しの行1と行2を表示する必要があります。また、ファイルを開くと、「開こうとしているファイル'xxxx.csv'はとは異なる形式です。ファイル拡張子で指定します。ファイルが破損していないことを確認してください...など。今すぐファイルを開きますか?」とにかくそれを修正しますか?それも原因かもしれません。

tldr; 1つだけでなく複数の行を含む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: $!"; 
4

2 に答える 2

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

CSV行は改行で区切られます。各行の後に改行を追加するだけです。

于 2012-06-01T20:38:27.580 に答える
2

Text::CSV別の解決策は、オブジェクトのインスタンス化を使用して、そこで目的のラインターミネーションを渡すことだと思います...

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

になります:

my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" })
  or die "Cannot use CSV: " . Text::CSV->error_diag();
于 2014-03-06T16:35:01.073 に答える