Forum Webscript.Ru
Программирование => Perl => Тема начата: hoochie от 15 Февраля 2005, 18:43:56
-
есть некий текстовый файл, который содержит инфу типа
17/11/2004 05:38:08, текст1, xxx.xxx.xxx.xxx:xxxxx, текст2
и так построчно...
где ххх.ххх.ххх.ххх:ххххх - айпи адрес:порт
задача(желательно на перле):
1. сделать что бы заносились даты в таблицу MySQL (они просто как бы игнорируются или формат даты неверен)
2. чтобы в таблицу заносились только айпи адреса без портов
вот таким скриптом я это делаю
#!/usr/bin/perl
use DBI;
$dbh=DBI->connect("DBI:mysql:database=DB;host=$host",
"user","pwd") || die print "Can\'t connect";
print "connect sucsessfully!\\nFor tansfer press ENTER...";
<>;
$dbh->do("LOAD DATA local INFILE \'/home/test/123/test.txt\' REPLACE
INTO table test FIELDS TERMINATED BY \';\' OPTIONALLY
ENCLOSED BY \'\\"\' LINES TERMINATED BY \'\\n\'")||die print "\\nfailed";
print "transfer OK!";
<>;
подскажите в чем ошибка
поля таблицы следующие:
date timestamp (пробовал datetime - тож не помогает)
col1 varchar
ip varchar
col2 varchar
-
hoochie:
есть некий текстовый файл, который содержит инфу типа
17/11/2004 05:38:08, текст1, xxx.xxx.xxx.xxx:xxxxx, текст2
hoochie:
FIELDS TERMINATED BY \';\'
-
прошу прощения, там FIELDS TERMINATED BY \', \'
но тем не менее, это не помогает...
именно поля содержащие дату просто не заносит в таблицу, остальное в порядке вроде....
-
hoochie
дебажить запрос не пробовал?
-
Вот пример абсолютно рабочего запроса подобного типа(данные уже считанны из файла и занесены в массив):
my $insert = "INSERT INTO $table (time_stamp,elaps,client_ip,
type_http,
size,
method,
url,
ident,
host_name,
mime,
chanel) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
foreach my $line_arr (@access_arr_in) {
my ($time_stamp,$elaps,$client_ip,$type_http,$size,$method,$url,$ident,$host_name,$mime,$chanel)=split(/[\\s\\t]+/,$line_arr);
$time_stamp=int $time_stamp;
chomp $chanel;
$sth->execute ($time_stamp,$elaps,$client_ip,$type_http,$size,$method,$url,$ident,$host_name,$mime,$chanel);
}
$sth->finish;
гораздо проще, по моему разумению, считать в массив и от туда загонять данные в базу. Врят ли у вас гигабайтные фалы...
Потом проще отработать сие на простом массиве в одну две записи и вы сразу же увидите проблему, причем, желательно весь запрос проверить сначала в mysql.
Возможно у вас не совпадают тип столюца с вводимыми данными.
P.S.:
там где split должно быть так (неотображает):
my ($time_stamp,$elaps,$client_ip,$type_http,$size,$method,$url,$ident,$host_name,$mime,$chanel)=split(/[\\s\\t]+/,$line_arr);
-
Это как альтернатива, если я правильно понял....
но меня интересует почему LOAD DATA INFILE не справляется...
если я массивом считываю данные, то загоняются без проблем...
2commander как ты предлагаешь это сделать???
-
hoochie:
как ты предлагаешь это сделать???
почитать perldoc DBI
в разделе METHODS COMMON TO ALL HANDLES
-
спасибо, будем разбираться...