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

Тема в разделе "Как сделать...", создана пользователем Q_BASIC, 8 окт 2014.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    381
    Симпатии:
    236
    Есть файл, весит около 40 Мб.
    Сами строчки не длинные, но их много. Ключ и значение разделены вертикальной палочкой (не знаю как называется)
    Код:
    Ключ|значение
    Ключ|значение
    Ключ|значение
    Ключ|значение
    Мне надо как-то запихать это в таблицу. В таблице в поле key должно быть ключ, а в поле value значение. При простом открытии всего файла PHP выдаёт ошибку, что превышен лимит памяти
     
    Последнее редактирование: 8 окт 2014
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    лучше содержимое файла хранить в виде хеша на диске, а в базе хранить имя хеша.
    в вашем же случае, нужно просто создать табличку из двух полей
    ключ и значение
    сделать explode по переносу строк, а потом внтури итерации explode по |
    и записывать как пары в табличку

    либо просто воспользоваться утилитами импорта, они сами всё предложат и сделают
     
  3. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    248
    Симпатии:
    143
    Код:
    $file = file("file.txt"); 
    foreach($file as $string){
    $var = explode('|',$string);
    mysql_query("INSERT INTO `таблица` (`key`,`value`) VALUES ($var[0],var[1])");
    }
     
  4. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    mo.Lex, Q_BASIC, ykpon и ещё 1-му нравится это.
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    381
    Симпатии:
    236
    Ошибка:
    #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
     
  6. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    381
    Симпатии:
    236
    Fatal error: Allowed memory size of 251658240 bytes exhausted (tried to allocate 32 bytes)
     
  7. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    Сорри ошибочка вышла - список полей надо в конце - так

    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 |
    +------+--------+
     
  8. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    381
    Симпатии:
    236
    А с этим мне куда? #1045 - Access denied for user 'user203_table'@'localhost' (using password: YES)
     
  9. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    это значит, что в комманде не было юзера и пароля, у меня они в my.cnf и mysql их читает оттуда автоматом

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

    mysql -uuser -ppassword ....
     
  10. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    192
    Симпатии:
    233
    Короткими строчками 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($fp1024))
    {
        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)."'";
    }