如何将文本文件信息存储到我的 sql 数据库中
how to store text file information into my sql database
this is my text file
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;
此代码对于该文本文件无法正常工作任何人都可以帮助我
DBD::mysql::st execute failed: called with 8 bind variables when 4 are
needed
该错误不是由您向我们展示的代码产生的。您的代码包含:
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]);
但我不知道它与其他可能在其他地方有空白的数据行一起工作的效果如何。
是的,可以使用 join() 来完成。由于所有值都由 space 分隔,因此您遇到了这个问题。如果您的文件是由您创建的,那么您只需添加逗号分隔值,例如 (1, Chellappa, CSE, 22 xx-colony 2nd street,coimbatore)。这将帮助您使用拆分获取所有数据,如下所示
拆分(',',).
this is my text file
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;
此代码对于该文本文件无法正常工作任何人都可以帮助我
DBD::mysql::st execute failed: called with 8 bind variables when 4 are needed
该错误不是由您向我们展示的代码产生的。您的代码包含:
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]);
但我不知道它与其他可能在其他地方有空白的数据行一起工作的效果如何。
是的,可以使用 join() 来完成。由于所有值都由 space 分隔,因此您遇到了这个问题。如果您的文件是由您创建的,那么您只需添加逗号分隔值,例如 (1, Chellappa, CSE, 22 xx-colony 2nd street,coimbatore)。这将帮助您使用拆分获取所有数据,如下所示 拆分(',',).