Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaimportować do MySQL ogromny plik CSV z 200,00 wierszami (asynchronicznie i szybko)?

Dziękuję wszystkim, którzy udzielili odpowiedzi na to pytanie. Znalazłem rozwiązanie! Chciałem się nim tylko podzielić, na wypadek gdyby ktoś potrzebował stworzyć skrypt PHP, który zaimportuje ogromny plik CSV do bazy danych MySQL (asynchronicznie i szybko!) Przetestowałem swój kod z 400 000 wierszy i import został zakończony w kilka sekund. Wierzę, że zadziałałoby to z większymi plikami, wystarczy zmienić maksymalny rozmiar przesyłanego pliku.

W tym przykładzie zaimportuję plik CSV, który zawiera dwie kolumny (nazwa, numer_kontaktu) do bazy danych MySQL, która zawiera te same kolumny.

Twój plik CSV powinien wyglądać tak:

Ana, 0906123489

Jan, 0908989199

Piotr, 0908298392

...

...

Oto rozwiązanie.

Najpierw utwórz swój stół

CREATE TABLE `testdb`.`table_test`
( `id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(100) NOT NULL ,
`contact_number` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`id`)) ENGINE = InnoDB;

Po drugie, mam 4 pliki PHP. Wszystko, co musisz zrobić, to umieścić to w jednym folderze. Pliki PHP są następujące:

indeks.php

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv" value="" />
<input type="submit" name="submit" value="Save" /></form>

connect.php

<?php
//modify your connections here
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testDB";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
?>

senddata.php

<?php
include('connect.php');
$data = $_POST['file'];
$handle = fopen($data, "r");
$test = file_get_contents($data);
if ($handle) {
    $counter = 0;
    //instead of executing query one by one,
    //let us prepare 1 SQL query that will insert all values from the batch
    $sql ="INSERT INTO table_test(name,contact_number) VALUES ";
    while (($line = fgets($handle)) !== false) {
      $sql .= "($line),";
      $counter++;
    }
    $sql = substr($sql, 0, strlen($sql) - 1);
     if ($conn->query($sql) === TRUE) {
    } else {
     }
    fclose($handle);
} else {  
} 
//unlink CSV file once already imported to DB to clear directory
unlink($data);
?>

prześlij.php

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script>
//Declaration of function that will insert data into database
 function senddata(filename){
        var file = filename;
        $.ajax({
            type: "POST",
            url: "senddata.php",
            data: {file},
            async: true,
            success: function(html){
                $("#result").html(html);
            }
        })
        }
 </script>
<?php
$csv = array();
$batchsize = 1000; //split huge CSV file by 1,000, you can modify this based on your needs
if($_FILES['csv']['error'] == 0){
    $name = $_FILES['csv']['name'];
    $ext = strtolower(end(explode('.', $_FILES['csv']['name'])));
    $tmpName = $_FILES['csv']['tmp_name'];
    if($ext === 'csv'){ //check if uploaded file is of CSV format
        if(($handle = fopen($tmpName, 'r')) !== FALSE) {
            set_time_limit(0);
            $row = 0;
            while(($data = fgetcsv($handle)) !== FALSE) {
                $col_count = count($data);
                //splitting of CSV file :
                if ($row % $batchsize == 0):
                    $file = fopen("minpoints$row.csv","w");
                endif;
                $csv[$row]['col1'] = $data[0];
                $csv[$row]['col2'] = $data[1];
                $min = $data[0];
                $points = $data[1];
                $json = "'$min', '$points'";
                fwrite($file,$json.PHP_EOL);
                //sending the splitted CSV files, batch by batch...
                if ($row % $batchsize == 0):
                    echo "<script> senddata('minpoints$row.csv'); </script>";
                endif;
                $row++; 
            }
            fclose($file);
            fclose($handle);
        }
    }
    else
    {
        echo "Only CSV files are allowed.";
    }
    //alert once done.
    echo "<script> alert('CSV imported!') </script>";
}
?>

Otóż ​​to! Masz już czysty skrypt PHP, który może zaimportować wiele wierszy w ciągu kilku sekund! :)(Podziękowania dla mojego partnera, który nauczył mnie i dał mi pomysł, jak używać ajax)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd wstawiania MySQL:ER_BAD_FIELD_ERROR:Nieznana kolumna „2525” w „liście pól”

  2. Entity Framework z MySQL

  3. Najlepszy sposób na sprawdzenie, czy mysql_query zwrócił jakieś wyniki?

  4. JSON koduje wyniki MySQL

  5. jak policzyć całkowity komentarz