【发布时间】:2015-05-06 05:11:31
【问题描述】:
数据表的列太多,无法一一选择,所以我试图将整个数据拉到一个文件中。 有许多列包含 UTC 和本地时间的日期时间。 当我使用以下脚本时,所有小时信息都被删除,只保存日期。如何轻松修复代码以保存整个日期时间信息?
总的来说,csv 文件中的所有日期时间数据都保存为“25-FEB-15”而不是“25-FEB-15 HH:MM:SS AM -08:00”
open(OUTFILE, "> ./outputfile.csv");
my($dbh,$sth);
$dbh = DBI->connect("xxx")
my $sqlGetEid = "
select *
from Table_1
where MARKET = 'Chicago' and DATETIMELOCAL >= '22-FEB-2015' and DATETIMELOCAL < '01-MAR-2015'
";
my $curSqlEid = $dbh->prepare($sqlGetEid);
$curSqlEid->execute();
my $counter = 0;
my $delimiter = ',';
my $fields = join(',', @{ $curSqlEid->{NAME_lc} });
print "$fields\n";
printf OUTFILE "$fields\n";
while (my @row = $curSqlEid->fetchrow_array) {
my $csv = join(',', @row)."\n";
printf OUTFILE "$csv";
$counter ++;
if($counter % 10000 == 0){
print $csv, "\n";
}
}
我已经根据下面的cmets修复了代码,但是问题还没有解决。我使用的数据库是 Oracle,所以基于 MySQL 的代码似乎不兼容。问题已缩小到 Oracle 使用的日期时间格式,因此通过正确处理格式可以解决此问题。但我不确定我必须使用哪个 perl 包来很好地处理 Oracle 数据时间格式。
use DBI;
use DBD::Oracle qw(:ora_types);
use Compress::Zlib;
use FileHandle;
use strict;
use warnings;
use DateTime;
use Data::Dumper;
use Text::CSV_XS;
use DateTime::Format::DateParse;
use DateTime::Format::DBI;
open(OUTFILE, "> ./output.csv");
my $dbh = DBI->connect("xxx")
my $sth = $dbh->prepare("SELECT * FROM Table_1");
$sth->execute;
my $fields = join(',', @{ $sth->{NAME_lc} });
#EXTRACT COLUMN NAMES
my @col_names = @{ $sth->{NAME_lc} } ;
my $column_names = join ", ", @col_names;
my $select = "
select $column_names
from Table_1
where MARKET = 'Chicago' and DATETIMELOCAL >= '22-FEB-2015' and DATETIMELOCAL < '01-MAR-2015'
";
my $query = $dbh->prepare($select);
$query->execute;
#WRITE DATA TO CSV FILE
my $csv_attributes = {
binary => 1, #recommneded
eol => $/, #recommended(I wonder why it's not $\ ?)
};
my $csv = Text::CSV_XS->new($csv_attributes);
my $fname = 'data.csv';
open my $OUTFILE, ">", $fname
or die "Couldn't open $fname: $!";
$csv->print($OUTFILE, \@col_names);
$csv->column_names(@col_names); #Needed for print_hr() below
while (my $row = $query->fetchrow_arrayref) {
print $row->[0];# $row->{datetimelocal} does not work
my $datetime = DateTime::Format::DBI->parse_datetime( $row->[0]) ; # This might be wrong
$row->[0] = strftime("%d-%b-%y %I:%M:%S %p", $datetime);
$csv->print($OUTFILE, $row);
}
close $OUTFILE;
$query->finish;
$dbh->disconnect;
【问题讨论】:
-
您需要阅读stackoverflow.com/questions/3639861/…。还请务必在 stackoverflow.com/a/60496/1015164 了解如何参数化查询。
-
另外,您是在查看原始 CSV 文件还是在 Excel 中打开它? Excel 在屏幕上的默认表示是没有时间的日期。如果你用记事本打开 CSV 文件,时间还没有吗?
-
我试过“select A,B,C”而不是“select *”,但结果是一样的。我只需要将其保存为原始 csv。
-
DATETIMELOCAL字段的数据类型是什么?此外,您不应该通过简单地用逗号连接每个字段来创建 CSV 文件。 CSV 的引用和转义规则复杂且不规范。如果您的任何字段包含逗号或双引号,则您的文件将损坏。相反,您应该使用Text::CSV_XS。 -
数据类型是日期时间,我用过"Text::CSV_XS",但结果是一样的。