CSV imports to MySQL



  • There's all the known csv import crypts in Mysql. Everything works properly, with one big and fat minus that covers all the benefits. Imports need about 100,000 lines. Everything works awfully long, and most of it doesn't end well. Can you tell me how to rewrite the violin so he can work more resiliently? There's also a way to use the PDO, but I'm not strong.

    if ($_FILES[csv][size] > 0) { 
    
    //Получаем CSV файл
    $file = $_FILES[csv][tmp_name]; 
    $handle = fopen($file,"r"); 
    
    //Обрабатываем в цикле CSV файл и добавляем данные в БД
    do { 
        if ($data[0]) { 
            mysql_query("INSERT INTO price_minsk (brand, artikul, description, ostatok, kratnost, valuta, price) VALUES 
                ( 
                    '".addslashes($data[0])."', 
                    '".addslashes($data[1])."', 
                    '".addslashes($data[2])."', 
                    '".addslashes($data[3])."', 
                    '".addslashes($data[4])."', 
                    '".addslashes($data[5])."', 
                    '".addslashes($data[6])."' 
                ) 
            "); 
        } 
    } while ($data = fgetcsv($handle,1000,";","'")); 
    // 
    
    //redirect 
    header('Location: import.php?success=1'); die; 
    

    }

    I also found a function that the Manuals say works fast. But how do you put it in the above-mentioned violin?

    function import_csv(
    $table, // Имя таблицы для импорта
    $afields, // Массив строк - имен полей таблицы
    $filename, // Имя CSV файла, откуда берется информация
    // (путь от корня web-сервера)
    $delim=',', // Разделитель полей в CSV файле
    $enclosed='"', // Кавычки для содержимого полей
    $escaped='\', // Ставится перед специальными символами
    $lineend='\r\n', // Чем заканчивается строка в файле CSV
    $hasheader=FALSE){ // Пропускать ли заголовок CSV

    if($hasheader) $ignore = "IGNORE 1 LINES ";
    else $ignore = "";
    $q_import = 
    "LOAD DATA INFILE '".
        $_SERVER['DOCUMENT_ROOT'].$filename."' INTO TABLE ".$table." ".
    "FIELDS TERMINATED BY '".$delim."' ENCLOSED BY '".$enclosed."' ".
    "    ESCAPED BY '".$escaped."' ".
    "LINES TERMINATED BY '".$lineend."' ".
    $ignore.
    "(".implode(',', $afields).")"
    ;
        return mysql_query($q_import);
    }
    



  • If you're allowed access LOAD DATA INFILEOf course it's about to use your function. Instead of the cycle, you just write:

    import_csv(
        'price_minsk', 
        array('brand', 'artikul', 'description', 'ostatok', 'kratnost', 'valuta', 'price'),
        $FILES['csv']['tmp_name'],
        ';',
        '\''
    );
    

    If you're not allowed to do this, you can modify your original function, but you can use the multiple-strike function. INSERT INTO

    if ($_FILES[csv][size] > 0) { 
        //Получаем CSV файл
        $file = $_FILES[csv][tmp_name]; 
        $handle = fopen($file,"r"); 
    
    //Обрабатываем в цикле CSV файл и добавляем данные в БД $rowsToInsert = array();
    $rowsCount = 100;
    $insertStmt = 'INSERT INTO price_minsk (`brand`, `artikul`, `description`, `ostatok`, `kratnost`, `valuta`, `price`) VALUES ';
    while ($data = fgetcsv($handle, 1000, ";", "'")) {
        if (7 == count($data)) {
            $row = array_map('mysql_real_escape_string', $data);
            $rowsToInsert[] = '("' . implode('", "', $row) . '")';
        }
        //Если набралось достаточное количество строк
        if ($rowsCount <= count($rowsToInsert)) {
            mysql_query($insertStmt . implode(', ', $rowsToInsert));
            $rowsToInsert = array();
        }
    }
    //Если остались строки для добавления
    if (!empty($rowsToInsert)) {
        mysql_query($insertStmt . implode(', ', $rowsToInsert));
        $rowsToInsert = array();
    }
    
    //redirect 
    header('Location: import.php?success=1'); die; 
    

    }

    You can try to increase. $rowsCount to reasonable limits. Mainly, the length of the request does not exceed the limit (max_allowed_packet)

    If necessary, this may be rewritten for use. mysqli At least PDO♪ It's not principled anymore.


Log in to reply
 


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2