Ка запихать огромный файл в MySql

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Есть файл, весит около 40 Мб.
Сами строчки не длинные, но их много. Ключ и значение разделены вертикальной палочкой (не знаю как называется)
Код:
Ключ|значение
Ключ|значение
Ключ|значение
Ключ|значение

Мне надо как-то запихать это в таблицу. В таблице в поле key должно быть ключ, а в поле value значение. При простом открытии всего файла PHP выдаёт ошибку, что превышен лимит памяти
 
Последнее редактирование:
лучше содержимое файла хранить в виде хеша на диске, а в базе хранить имя хеша.
в вашем же случае, нужно просто создать табличку из двух полей
ключ и значение
сделать explode по переносу строк, а потом внтури итерации explode по |
и записывать как пары в табличку

либо просто воспользоваться утилитами импорта, они сами всё предложат и сделают
 
Код:
$file = file("file.txt"); 
foreach($file as $string){
$var = explode('|',$string);
mysql_query("INSERT INTO `таблица` (`key`,`value`) VALUES ($var[0],var[1])");
}
 
Fatal error: Allowed memory size of 251658240 bytes exhausted (tried to allocate 32 bytes)
Код:
$file = file("file.txt");
foreach($file as $string){
$var = explode('|',$string);
mysql_query("INSERT INTO `таблица` (`key`,`value`) VALUES ($var[0],var[1])");
}
 
Ошибка:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COLUMNS TERMINATED BY '|'' at line 1

Сорри ошибочка вышла - список полей надо в конце - так

LOAD DATA INFILE '/home/user/file.txt' INTO TABLE tbl_name COLUMNS TERMINATED BY '|' (`key`, value);

вот проверил

➜ ~ mysql test -e 'create table nulled(`key` varchar(200), value varchar(200))'
➜ ~ echo 'key1|value1' >> /tmp/file.txt
➜ ~ echo 'key2|value2' >> /tmp/file.txt
➜ ~ mysql test --local-infile -e 'LOAD DATA INFILE "/tmp/file.txt" INTO TABLE nulled(`key`, value) COLUMNS TERMINATED BY "|";'
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COLUMNS TERMINATED BY "|"' at line 1
➜ ~ mysql test --local-infile -e 'LOAD DATA INFILE "/tmp/file.txt" INTO TABLE nulled COLUMNS TERMINATED BY "|" (`key`, value);'
➜ ~ mysql test -e 'select * from nulled'
+------+--------+
| key | value |
+------+--------+
| key1 | value1 |
| key2 | value2 |
+------+--------+
 
А с этим мне куда? #1045 - Access denied for user 'user203_table'@'localhost' (using password: YES)
 
А с этим мне куда? #1045 - Access denied for user 'user203_table'@'localhost' (using password: YES)

это значит, что в комманде не было юзера и пароля, у меня они в my.cnf и mysql их читает оттуда автоматом

их можно указать таким образом:

mysql -uuser -ppassword ....
 
Короткими строчками 40 Мб это ж около двух лямов записей o_O
Тогда читать кусками и всталять INSERT INTO tbl_name VALUES (1,2),(3,4),(5,6)
PHP:
define('_table_', 'test');
define('_max_len_', 200000);

$fp = fopen('file.txt', 'r');
$sql = '';

while($line = fgets($fp, 1024))
{
    list($key, $value) = explode("|", $line);
    $value = rtrim($value);
    $item = "(".quote($key).", ".quote($value).")";

    if (empty($sql))
    {
        $sql = 'INSERT INTO `'._table_.'` VALUES '.$item;
    }
    elseif (_max_len_ > strlen($sql) + strlen($item))
    {
        $sql .= ", ".$item;
    }
    else
    {
        mysql_query($sql);
        $sql = 'INSERT INTO `'._table_.'` VALUES '.$item;
    }
}
mysql_query($sql);

fclose($fp);

function quote($str)
{
    return "'".mysql_real_escape_string($str)."'";
}
 
Назад
Сверху