Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengimpor file CSV besar dengan 200,00 baris ke MySQL (asinkron dan cepat)?

Terima kasih kepada semua orang yang memberikan jawaban atas pertanyaan ini. Saya telah menemukan solusinya! Hanya ingin membagikannya, jika seseorang perlu membuat skrip PHP yang akan mengimpor file CSV besar ke dalam database MySQL (secara asinkron dan cepat!) Saya telah menguji kode saya dengan 400.000 baris dan pengimporan selesai dalam hitungan detik. Saya yakin ini akan berfungsi dengan file yang lebih besar, Anda hanya perlu mengubah ukuran file unggahan maksimum.

Dalam contoh ini, saya akan mengimpor file CSV yang berisi dua kolom (nama, contact_number) ke dalam DB MySQL yang berisi kolom yang sama.

File CSV Anda akan terlihat seperti ini :

Ana, 0906123489

John, 0908989199

Peter, 0908298392

...

...

Jadi, inilah solusinya.

Pertama, buat tabel Anda

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;

Kedua, saya punya 4 file PHP. Yang harus Anda lakukan adalah menempatkan ini ke dalam satu folder. File PHP adalah sebagai berikut :

index.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>

koneksi.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);
?>

upload.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>";
}
?>

Itu dia! Anda sudah memiliki skrip PHP murni yang dapat mengimpor beberapa baris dalam hitungan detik! :)(Terima kasih kepada rekan saya yang telah mengajari dan memberi saya ide tentang cara menggunakan 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. Bagaimana Fungsi OCT() Bekerja di MySQL

  2. MySQL VARCHAR Panjang dan UTF-8

  3. Mengimpor data CSV menggunakan PHP/MySQL

  4. MySQL - Mengulang struktur pohon

  5. mySQL DataSource di Visual Studio 2012