私のデータファイル:votes.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ステートメントを介して実行され、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
投票.txtでnull値が検出されると、$errors変数がインクリメントされます。
スクリプトはvotes.txtを正常にループしているように見えますが、初期化に失敗しています:$campaign_idおよび$candidate_id変数または。完了すると、errors=19が端末に出力されます。サンプルデータvotes.txtの行の総数。つまり、このファイルのすべての行をデータベースに挿入できませんでした。
mysql> select * from voting;
Empty set (0.00 sec)
これを確認します。
スクリプトは構文エラーを報告しません。したがって、それはより低いレベルです。スイッチがなくても正常に動作します。したがって、それはそれをいくらか絞り込んだ。スイッチの問題はわかりませんが、ここでアドバイスを探しています。