【发布时间】:2016-01-23 12:40:03
【问题描述】:
我有这个 Perl 脚本:
use v5.12;
use strict;
use warnings;
use DBI;
my $dsn = "DBI:mysql:host=localhost;database=testitt";
my $dbh = DBI->connect($dsn,"root","")
or die "No db connectin: $!";
say "Connected to MySQL.";
my $source_dir = "C:/Users/ST/Desktop/";
opendir my $dirh, $source_dir or die "Unable to open directory: $!";
my @files = grep /\.csv$/i, readdir $dirh;
closedir $dirh;
die "No files found in $source_dir" unless @files;
say 'Importing data from:';
say for @files;
my $load = $dbh->prepare("LOAD DATA INFILE ? INTO TABLE tablea Character Set utf8 FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n' IGNORE 1 LINES (id, normalized_count)")
or die "Prepare failed: " . $dbh->errstr();
for my $file (@files) {
say "Processing $source_dir/$file";
open my $fh, '<', "$source_dir/$file"
or die "Unable to open $source_dir/$file: $!\n";
$load->execute($file)
or die "Execute failed: " . $dbh->errstr();
}
print "Jobs done.\n";
它在$load->execute($file) 处给了我错误,因为它无法找到该文件,但我已经在代码的早期在@file 上加载了所有内容。
编辑: 感谢马特的建议,我现在更干净了,但我无法找到将当前文件放入查询(令牌)的方法,尝试以下但给出错误:
for my $file (@files) {
my $statement = $dbh->prepare("LOAD DATA INFILE C:\\Users\\ST\\Desktop\\"$file"INTO TABLE rnaseq Character Set utf8 FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n' IGNORE 1 LINES (id,normalized_count)");
$statement->execute()
【问题讨论】:
-
一些事情: 1. 你不需要打开每个文件在循环中读取(MySQL 正在做这部分)。 2. 你甚至可以在那里使用占位符吗? 3.文件名应该使用绝对路径,否则“服务器在默认数据库的数据库目录中查找文件”(source)。