这是我的文本文件
StudentId Name Dept address city
1 Chellappa CSE 22 xx-colony 2nd street coimbatore
2 Vijay IT 23 yy colony coimbatore
在此文件中(22 xx-colony 2nd street)和(23 yy colony)是存储在数据库地址栏中的地址
use DBI;
use strict;
my $driver = "mysql";
my $database = "TESTDB";
my $dsn = "DBI:$driver:database=$database";
my $userid = "root";
my $password = "1234";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
my $query = 'INSERT INTO student (StudentId,Name,Dept,address,city) VALUES (?,?,?,?,?)';
my $sth = $dbh->prepare($query) or die "Prepare failed: " . $dbh->errstr();
open my $fh, "<", "text.txt" or die $!;
<$fh>; #skip header
while (<$fh>)
{
chomp;
my @vals = split;
$sth->execute(@vals);
}
close $fh;
此代码对于任何人都可以帮助我的文本文件无法正常工作
答案 0 :(得分:1)
DBD :: mysql :: st执行失败:当4为时,调用8个绑定变量 需要
您向我们展示的代码不会生成该错误。您的代码包含:
my $query = 'INSERT INTO student (StudentId,Name,Dept,address,city) VALUES (?,?,?,?,?)';
该SQL查询包含五个绑定点,而不是四个。在报告这些事情时,准确是非常重要的。
无论如何,重要的是绑定点的数量与传递给execute()
的值的数量不同。并且很容易看出问题的来源。
您的第一个数据行是:
1 Chellappa CSE 22 xx-colony 2nd street coimbatore
然后使用以下代码将该数据拆分为@vals
数组:
my @vals = split;
如果没有参数,split()
会在空白处拆分$_
(您可以read the documentation online)。
因此,在对该数据运行该代码后,您将在@vals
中得到八个值。这些值是:
1, Chellappa, CSE, 22, xx-colony, 2nd, street, coimbatore
很明显,您的简单split()
并非以您期望的方式处理您的数据。您需要提出一种更复杂的方法来从输入记录中提取五个预期的数据项。
很遗憾,您没有向我们提供有关输入文件结构的详细信息,因此我们无法为您提供有关如何解决问题的更多帮助。
更新:猜测您可能需要的内容,更新声明可能会变成:
$sth->update(@vals[0 .. 2], join ' ', @vals[3..6], $vals[7]);
但是我不知道它可以与其他地方可能有空格的其他数据行一起使用。
答案 1 :(得分:0)
是的,可以使用join()完成。由于您将所有值分隔为空格,因此您遇到此问题。如果您的文件是由您创建的,那么您可以添加逗号分隔值,例如(1,Chellappa,CSE,22 xx-colony 2nd street,coimbatore)。这将帮助您使用拆分获取所有数据,如下所示 的分裂( '')强>