我的数据文件:由空格分隔的每个条目导入日志文件数据到应用程序
VOTE 1168241980 Campaign:ssss_uk_01B Validity:during
Choice:Tupele CONN:MIG00VU MSISDN:00088866655598
GUID:A34-FDS87-FHDHDH-DHDHDHD0 Shortcode:63334
:votes.txt与行相同地形成。我目前有19行的样本。
领域:
CONN:MIG00VU MSISDN:00088866655598
GUID:A34-FDS87-FHDHDH-DHDHDHD0 Shortcode:63334
不被用于这项工作。
#!/usr/bin/perl
use warnings;
use strict;
use Switch;
use DBI();
#
# _voting.pl
#
# Connect to the database.
my $dbh = DBI->connect("DBI:mysql:database=sms_voting;host=localhost",
"sisisi", "*********",
{'RaiseError' => 1});
my $sth = $dbh->prepare("INSERT INTO voting
(epoch, validity, choice, campaigns_id, candidates_id) VALUES (?,?,?,?,?)");
open (LOGFILE, '/var/www/voting/votes.txt') or die("Could not open log file.");
my $errors = 0;
my $campaign_id = 0;
my $candidate_id = 0;
foreach my $line (<LOGFILE>) {
my ($vote, $epoch, $campaign, $validity,
$choice, $CONN, $MSISDN, $GUID, $Shortcode) = split(' ', $line);
# parse the field:value entries...
$campaign = substr $campaign, 8, 11, '';
$validity = substr $validity, 9, 6, ''; # during
$choice = substr $choice, 7, 10, ''; # Brown
# case statements to define correct foreign keys...
switch ($campaign) {
case ("ssss_uk_01B") { $campaign_id = 1 }
case ("ssss_uk_01C") { $campaign_id = 2 }
case ("ssss_uk_01D") { $campaign_id = 3 }
case ("ssss_uk_01E") { $campaign_id = 4 }
case ("ssss_uk_01F") { $campaign_id = 5 }
case ("ssss_uk_01G") { $campaign_id = 6 }
}
switch ($choice) {
case ("Brown") { $candidate_id = 1 }
case ("Cameron") { $candidate_id = 2 }
case ("Balls") { $candidate_id = 3 }
case ("Green") { $candidate_id = 4 }
case ("Boring") { $candidate_id = 5 }
case ("Tupele") { $candidate_id = 6 }
}
if ($epoch && $validity && $choice && $campaign_id && $candidate_id) {
$sth->execute($epoch, $validity, $choice, $campaign_id, $candidate_id);
# debug
print "$epoch $validity $choice \n"; # 1161048980 during Green
next;
}
$errors++;
}
close (LOGFILE);
# debug
print qq(errors=$errors\n);
对foreach,在$活动和$选择变量的各回路通过switch语句,以便确定candidate_id & CAMPAIGN_ID号运行。这些外键将映射到候选人&广告系列表。
查看:http://acookson.org/wp-content/themes/cookie_23112012/img/sms_voting.png为数据库模型。
即
INSERT INTO voting (epoch, validity, choice, campaigns_id, candidates_id)
VALUES (1161048980,'during','Brown', 1, 1),
(1161048980,'during','Tupele', 3, 5), ... etc
任何空在votes.txt检测值将导致$误差变量被递增。
该脚本似乎成功地通过votes.txt循环但未能初始化:$ campaign_id & $ candidate_id variables resp。完成后,错误= 19被打印到终端;我的示例数据votes.txt中的总行数;含义 此文件中的每一行未能插入到数据库中。
mysql> select * from voting;
Empty set (0.00 sec)
证实了这一点。
脚本报告没有语法错误;因此它更低一些。没有开关就能正常工作;因此这有所缩小。但我无法看到交换机的问题,所以我在这里寻找建议。
据我所知,'Switch'模块在perl v5.10.1中已被弃用,并由'given/when'功能取代。参见[perldoc perlsyn](http://perldoc.perl.org/perlsyn.html#Switch-Statements)。但是,我会建议您使用散列来代替该查找。 – TLP