[英]A Perl script to import multiple CSV files into a MySQL database
我有这个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()
主要问题在于,当提供相对路径时,看起来LOAD DATA INFILE
的行为在直观上并不明显。
如果未指定
LOCAL
,则该文件必须位于服务器主机上,并且可以由服务器直接读取。 服务器使用以下规则来定位文件:
- 如果文件名是绝对路径名,则服务器将使用给定的名称。
- 如果文件名是具有一个或多个前导组件的相对路径名,则服务器将搜索相对于服务器数据目录的文件。
- 如果给出的文件名中没有前导组件,则服务器将在默认数据库的数据库目录中查找该文件。
因此,我建议为每个文件构造一个绝对路径,而不要依赖更神秘的第二和第三选项。
关于您的编辑,我注意到了几个问题。 您需要引用整个路径,我会坚持使用正斜杠,如下所示:
for my $file (@files) {
$dbh->do(qq{
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)
});
}
如果那不起作用,我可能只print
语句并将它们通过管道传递到mysql
命令中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.