我的數據文件:由空格分隔的每個條目導入日誌文件數據到應用程序
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