繁体   English   中英

一个Perl脚本将多个CSV文件导入到MySQL数据库中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM