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
- 
				спасибо, будем разбираться...