Perl从xls读取插入到mysql

我是相当新的Perl,我正在写一个Perl脚本从xls读取数据,并将结果插入MySQL DB,但我有问题…这是我的代码:

#!/usr/local/bin/perl use strict; use warnings; use diagnostics; use Spreadsheet::ParseExcel; use DBI; use Data::Dumper qw(Dumper); my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse('test.xls'); my $dbh = DBI->connect("dbi:mysql:parser", "root", "123qwe", { RaiseError => 1}) or die $DBI::errstr; my $query = 'INSERT INTO parser (Name,Country) VALUES (?,?)'; my $sth = $dbh->prepare($query) or die "Prepare failed: " . $dbh->errstr(); if ( !defined $workbook ) { die $parser->error(), ".\n"; } for my $worksheet ( $workbook->worksheets() ) { my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for my $row ( $row_min .. $row_max ) { for my $col ( $col_min .. $col_max ) { my $cell = $worksheet->get_cell( $row, $col ); next unless $cell; my $results = $cell->value(); open(my $fh, '>>', "test"); print $fh "$results\t"; close $fh; } } } open my $fh, "<", "test" or die $!; while (<$fh>) { chomp; my @vals = split; $sth->execute(@vals); } close $fh; 

所以当我执行脚本时,它以下面的错误结束:

 DBD::mysql::st execute failed: called with 6 bind variables when 2 are needed at ./parser.pl line 39, <$fh> line 1. Uncaught exception from user code: DBD::mysql::st execute failed: called with 6 bind variables when 2 are needed at ./parser.pl line 39, <$fh> line 1. 

这是很自然的,因为在输出中确实有6个variables:

 John Smith USA Ognyan Penkov Egypt 

所以问题是,我似乎无法find一种方法来分割每个列/行的结果,并将它们放在MySQL表中,因为Spreadsheet :: ParseExcel将所有date读为1行(例如,名称必须表名和国家表国家)

我的XLS文件如下所示:

  AB 1. John Smith USA 2. Ognyan Penkov Egypt ...etc... 

我的MySQL表:

 +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | id | int(6) | NO | PRI | NULL | auto_increment | | Name | varchar(255) | YES | | NULL | | |Country | varchar(255) | YES | | NULL | | +--------+--------------+------+-----+---------+----------------+ 

您正在打开一个名为test的文件,以便文档中的每个单元添加书写。 然后添加当前单元格的值,然后添加制表符\t字符。 然后,你打开并逐行阅读相同的文件(但只有一行), chomp结束不在那里(因为你没有放一个),并split空白, 因为没有分隔符分割使用\s ,这是一个单一的空白

如果省略,PATTERN默认为一个空格,“”,触发前面描述的awk仿真。

这正是问题,因为你的文件看起来像这样:

 John\tSmith\tUSA\tOgnyan\tPenkov\tEgypt 

\t单个空格 ,所以您最终以@val作为所有这些。 如果你把它传递给你的查询,它会失败。

既然你不这样做,就像你说的那样,有一张名字表和一张国家的表,但是你所做的只是将Excel文件中的数据逐行放入一个MySQL表中,你可以在$row循环。

 for my $worksheet ( $workbook->worksheets() ) { my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for my $row ( $row_min .. $row_max ) { my @values; for my $col ( $col_min .. $col_max ) { my $cell = $worksheet->get_cell( $row, $col ); next unless $cell; push @values, $cell->value(); } $sth->execute(@values) or die $dbh->errstr; } }