【发布时间】:2023-04-03 20:10:01
【问题描述】:
我正在尝试将值逐行插入到MySQL 表中,该值是从Perl 中的CSV 文件中读取的。如果 CSV 文件中的任何字段为空,则将有两个连续的逗号。例如
Firstname,Lastname,Code,Phone,Email
fname1,lname1,123,34543,f1@gmail.com
fname2,lname2,344,45645,f2@gmail.com
fname3,lname3,454,,f3@gmail.com
第三行没有电话号码。所以有两个连续的逗号。当我们尝试使用以下命令插入 mysql 时,它失败了。
insert into table1 (Firstname,Lastname,Code,Phone,Email) values (fname3,lname3,454,,f3@gmail.com)
怎么做?
我使用以下代码来做到这一点。
open CSV, $file or die $!;
my @csv_content = <CSV>;
close CSV;
my $fields = "Firstname,Lastname,Code,Phone,Email";
my $table = "table1";
my $csv = Text::CSV->new();
foreach(@csv_content){
if($csv->parse($_)){
my @values = $csv->fields();
my $status = $csv->combine(@values);
my $line = $csv->string();
$statement = "INSERT INTO $table($fields) VALUES($line);";
$sth = $dbh->prepare( $statement );
$sth->execute() or die "$! $DBI::errstr";
}
}
【问题讨论】:
-
MySQL 可以使用 LOAD DATA INFILE 语法直接加载 CSV。除非您需要以某种方式预处理 CSV,否则我建议您使用它。
-
我需要预处理 csv 所以这不是一个选项。
-
1/ 在 SQL 中使用绑定点。 2/
prepare()循环外的 SQL(第二点不是解决您的问题 - 它是提高代码的效率)。
标签: mysql perl csv sql-insert