mysql - Perl 从 xls 读取插入到 mysql

标签 mysql excel perl

我是 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 个变量:

John Smith  USA Ognyan Penkov   Egypt

所以问题是我似乎无法找到一种方法来拆分每一列/行的结果并将它们放入 MySQL 表中,因为 Spreadsheet::ParseExcel 将所有日期读取为 1 行。(例如名称必须去表格名称和国家表格国家)

我的 XLS 文件如下所示:

       A           B
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 在空白处,because split without a delimiter uses \s , 这是一个空格

If omitted, PATTERN defaults to a single space, " " , triggering the previously described awk emulation.

这正是问题所在,因为您的文件如下所示:

John\tSmith\tUSA\tOgnyan\tPenkov\tEgypt

\t单个空格,所以您最终得到的是 @val。如果您将其传递给您的查询,它将失败。

正如您所说,您没有名称表和国家表,而是您所做的只是将 Excel 文件中的数据逐行,您可以在 $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;
    }
}

关于mysql - Perl 从 xls 读取插入到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131617/

相关文章:

vba - 将 excel 工作表导出为 PDF 运行时错误 '5' : Invalid procedure call or argument

regex - 在执行前测试 perl -pi -e one-liner 的最佳方法?

perl - 当 token 之间没有值时,Perl 拆分函数返回什么?

php - PHP 中的数据标准?

mysql - 如何从两个表中获取数据

mysql - SQL 从 3 个具有相同列名的表中选择

php - 如何在MySQL和php中检测记录是否被修改

excel - 在 Excel 散点图中使用文本作为水平标签

python - Openpyxl ['MergedCell'对象属性 'hyperlink'是只读]问题

perl - 为什么我需要为 IIS 而不是 Apache 显式输出 HTTP header ?