Мой файл данных: voices.txt состоит из строк, идентичных:
VOTE 1168241980 Campaign:ssss_uk_01B Validity:during
Choice:Tupele CONN:MIG00VU MSISDN:00088866655598
GUID:A34-FDS87-FHDHDH-DHDHDHD0 Shortcode:63334
с каждой записью, разделенной пробелом. В настоящее время у меня есть образец из 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 переменные $campaign и $choice обрабатываются операторами switch, чтобы определить номера кандидатов_идентификаторов и кампаний_идентификаторов. Эти внешние ключи будут отображаться в таблицах кандидатов и кампаний соответственно.
см.: http://acookson.org/wp-content/themes/cookie_23112012/img/sms_voting.png для модели базы данных.
i.e.
INSERT INTO voting (epoch, validity, choice, campaigns_id, candidates_id )
VALUES (1161048980,'during','Brown', 1, 1),
(1161048980,'during','Tupele', 3, 5), ... etc
Любые нулевые значения, обнаруженные в файле voices.txt, приведут к увеличению переменной $errors.
Сценарий, кажется, успешно проходит через voices.txt, но не может инициализировать: переменные $campaign_id и $candidate_id соответственно. По завершении на терминал выводится error=19; общее количество строк в моем образце данных voices.txt; это означает, что каждая строка в этом файле не может быть вставлена в базу данных.
mysql> select * from voting;
Empty set (0.00 sec)
подтверждает это.
Сценарий не сообщает об ошибках синтаксиса; следовательно, это более низкий уровень. Он отлично работает без переключателя; следовательно, это несколько сузило его. Однако я не вижу проблемы с переключателем, поэтому ищу здесь совета.
Switch
устарел и заменен функциональностьюgiven/when
в perl v5.10.1. См. perldoc perlsyn. Однако я бы порекомендовал вам вместо этого использовать хэш для этого поиска. - person TLP   schedule 01.12.2012